15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQL_TRANSACTION_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SQL_TRANSACTION_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/sql_export.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sql {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Connection;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SQL_EXPORT Transaction {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates the scoped transaction object. You MUST call Begin() to begin the
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // transaction. If you have begun a transaction and not committed it, the
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // constructor will roll back the transaction. If you want to commit, you
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need to manually call Commit before this goes out of scope.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nested transactions are supported. See sql::Connection::BeginTransaction
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for details.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit Transaction(Connection* connection);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Transaction();
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true when there is a transaction that has been successfully begun.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_open() const { return is_open_; }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Begins the transaction. This uses the default sqlite "deferred" transaction
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // type, which means that the DB lock is lazily acquired the next time the
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database is accessed, not in the begin transaction command.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false on failure. Note that if this fails, you shouldn't do
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // anything you expect to be actually transactional, because it won't be!
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Begin();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Rolls back the transaction. This will happen automatically if you do
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // nothing when the transaction goes out of scope.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Rollback();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Commits the transaction, returning true on success. This will return
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // false if sqlite could not commit it, or if another transaction in the
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // same outermost transaction has been rolled back (which necessitates a
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // rollback of all transactions in that outermost one).
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Commit();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Connection* connection_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True when the transaction is open, false when it's already been committed
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or rolled back.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_open_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Transaction);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace sql
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // SQL_TRANSACTION_H_
61