| Index: chrome/browser/sync/util/row_iterator.h
|
| ===================================================================
|
| --- chrome/browser/sync/util/row_iterator.h (revision 0)
|
| +++ chrome/browser/sync/util/row_iterator.h (revision 0)
|
| @@ -0,0 +1,122 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// A handy type for iterating through query results.
|
| +//
|
| +// Just define your Traits type with
|
| +//
|
| +// RowType
|
| +// Extract(statement*, RowType);
|
| +//
|
| +// and then pass an sqlite3_stmt into the constructor for begin,
|
| +// and use the no-arg constructor for an end iterator. Ex:
|
| +//
|
| +// for (RowIterator<SomeTraits> i(statement), end; i != end; ++i)
|
| +// ...
|
| +
|
| +#ifndef CHROME_BROWSER_SYNC_UTIL_ROW_ITERATOR_H_
|
| +#define CHROME_BROWSER_SYNC_UTIL_ROW_ITERATOR_H_
|
| +
|
| +#include "base/logging.h"
|
| +#include "third_party/sqlite/preprocessed/sqlite3.h"
|
| +
|
| +template <typename ColumnType, int index = 0>
|
| +struct SingleColumnTraits {
|
| + typedef ColumnType RowType;
|
| + inline void Extract(sqlite3_stmt* statement, ColumnType* x) const {
|
| + GetColumn(statement, index, x);
|
| + }
|
| +};
|
| +
|
| +template <typename RowTraits>
|
| +class RowIterator : public std::iterator<std::input_iterator_tag,
|
| + const typename RowTraits::RowType> {
|
| + public:
|
| + typedef typename RowTraits::RowType RowType;
|
| + // Statement must have been prepared, but not yet stepped:
|
| + RowIterator(sqlite3_stmt* statement, RowTraits traits = RowTraits()) {
|
| + kernel_ = new Kernel;
|
| + kernel_->done = false;
|
| + kernel_->refcount = 1;
|
| + kernel_->statement = statement;
|
| + kernel_->row_traits = traits;
|
| + ++(*this);
|
| + }
|
| + RowIterator() : kernel_(NULL) { } // creates end iterator
|
| +
|
| + RowIterator(const RowIterator& i)
|
| + : kernel_(NULL) {
|
| + *this = i;
|
| + }
|
| +
|
| + ~RowIterator() {
|
| + if (kernel_ && 0 == --(kernel_->refcount)) {
|
| + sqlite3_finalize(kernel_->statement);
|
| + delete kernel_;
|
| + }
|
| + }
|
| +
|
| + RowIterator& operator = (const RowIterator& i) {
|
| + if (kernel_ && (0 == --(kernel_->refcount))) {
|
| + sqlite3_finalize(kernel_->statement);
|
| + delete kernel_;
|
| + }
|
| + kernel_ = i.kernel_;
|
| + if (kernel_)
|
| + kernel_->refcount += 1;
|
| + return *this;
|
| + }
|
| +
|
| + RowIterator operator ++(int) {
|
| + RowIterator i(*this);
|
| + return ++i;
|
| + }
|
| +
|
| + RowIterator& operator ++() {
|
| + DCHECK(NULL != kernel_);
|
| + if (SQLITE_ROW == sqlite3_step(kernel_->statement)) {
|
| + kernel_->row_traits.Extract(kernel_->statement, &kernel_->row);
|
| + } else {
|
| + kernel_->done = true;
|
| + }
|
| + return *this;
|
| + }
|
| +
|
| + const RowType& operator *() const {
|
| + return *(operator -> ());
|
| + }
|
| +
|
| + const RowType* operator ->() const {
|
| + DCHECK(NULL != kernel_);
|
| + DCHECK(!kernel_->done);
|
| + return &(kernel_->row);
|
| + }
|
| +
|
| + bool operator == (const RowIterator& i) const {
|
| + if (kernel_ == i.kernel_)
|
| + return true;
|
| + if (NULL == kernel_ && i.kernel_->done)
|
| + return true;
|
| + if (NULL == i.kernel_ && kernel_->done)
|
| + return true;
|
| + return false;
|
| + }
|
| +
|
| + bool operator != (const RowIterator& i) const {
|
| + return !(*this == i);
|
| + }
|
| +
|
| + protected:
|
| + struct Kernel {
|
| + int refcount;
|
| + bool done;
|
| + RowType row;
|
| + sqlite3_stmt* statement;
|
| + RowTraits row_traits;
|
| + };
|
| +
|
| + Kernel* kernel_;
|
| +};
|
| +
|
| +#endif // CHROME_BROWSER_SYNC_UTIL_ROW_ITERATOR_H_
|
|
|
| Property changes on: chrome\browser\sync\util\row_iterator.h
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|