// Copyright (c) 2012 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.

#ifndef SQL_TRANSACTION_H_
#define SQL_TRANSACTION_H_

#include "base/macros.h"
#include "sql/sql_export.h"

namespace sql {

class Connection;

class SQL_EXPORT Transaction {
 public:
  // Creates the scoped transaction object. You MUST call Begin() to begin the
  // transaction. If you have begun a transaction and not committed it, the
  // constructor will roll back the transaction. If you want to commit, you
  // need to manually call Commit before this goes out of scope.
  //
  // Nested transactions are supported. See sql::Connection::BeginTransaction
  // for details.
  explicit Transaction(Connection* connection);
  ~Transaction();

  // Returns true when there is a transaction that has been successfully begun.
  bool is_open() const { return is_open_; }

  // Begins the transaction. This uses the default sqlite "deferred" transaction
  // type, which means that the DB lock is lazily acquired the next time the
  // database is accessed, not in the begin transaction command.
  //
  // Returns false on failure. Note that if this fails, you shouldn't do
  // anything you expect to be actually transactional, because it won't be!
  bool Begin();

  // Rolls back the transaction. This will happen automatically if you do
  // nothing when the transaction goes out of scope.
  void Rollback();

  // Commits the transaction, returning true on success. This will return
  // false if sqlite could not commit it, or if another transaction in the
  // same outermost transaction has been rolled back (which necessitates a
  // rollback of all transactions in that outermost one).
  bool Commit();

 private:
  Connection* connection_;

  // True when the transaction is open, false when it's already been committed
  // or rolled back.
  bool is_open_;

  DISALLOW_COPY_AND_ASSIGN(Transaction);
};

}  // namespace sql

#endif  // SQL_TRANSACTION_H_
