aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2011-03-29 14:43:47 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2011-03-29 14:43:47 +0200
commit83aede3c9e27a8370c71dbde3549905c60524702 (patch)
treef6e9f617a1e9183b67e6597d1a5179db6ac874c1
parent2fe2c22fa340e4854a69a1c17d94f8e58ba68ad4 (diff)
Add support for starting immediate and exclusive transactions
-rw-r--r--odb/sqlite/database.cxx20
-rw-r--r--odb/sqlite/database.hxx8
-rw-r--r--odb/sqlite/statement-cache.cxx22
-rw-r--r--odb/sqlite/statement-cache.hxx27
-rw-r--r--odb/sqlite/transaction-impl.cxx23
-rw-r--r--odb/sqlite/transaction-impl.hxx9
6 files changed, 102 insertions, 7 deletions
diff --git a/odb/sqlite/database.cxx b/odb/sqlite/database.cxx
index 176c392..912ec97 100644
--- a/odb/sqlite/database.cxx
+++ b/odb/sqlite/database.cxx
@@ -97,7 +97,25 @@ namespace odb
if (transaction::has_current ())
throw already_in_transaction ();
- return new transaction_impl (*this);
+ return new transaction_impl (*this, transaction_impl::deferred);
+ }
+
+ transaction_impl* database::
+ begin_immediate ()
+ {
+ if (transaction::has_current ())
+ throw already_in_transaction ();
+
+ return new transaction_impl (*this, transaction_impl::immediate);
+ }
+
+ transaction_impl* database::
+ begin_exclusive ()
+ {
+ if (transaction::has_current ())
+ throw already_in_transaction ();
+
+ return new transaction_impl (*this, transaction_impl::exclusive);
}
}
}
diff --git a/odb/sqlite/database.hxx b/odb/sqlite/database.hxx
index 121f85c..cfff30f 100644
--- a/odb/sqlite/database.hxx
+++ b/odb/sqlite/database.hxx
@@ -78,6 +78,8 @@ namespace odb
}
public:
+ using odb::database::execute;
+
virtual unsigned long long
execute (const char* statement, std::size_t length);
@@ -85,6 +87,12 @@ namespace odb
virtual transaction_impl*
begin ();
+ transaction_impl*
+ begin_immediate ();
+
+ transaction_impl*
+ begin_exclusive ();
+
public:
details::shared_ptr<connection_type>
connection ();
diff --git a/odb/sqlite/statement-cache.cxx b/odb/sqlite/statement-cache.cxx
index 383a78e..ba7b56c 100644
--- a/odb/sqlite/statement-cache.cxx
+++ b/odb/sqlite/statement-cache.cxx
@@ -17,13 +17,29 @@ namespace odb
// String lengths below include '\0', as per SQLite manual
// suggestions.
//
- begin_ (new (shared) simple_statement (conn, "BEGIN", 6)),
- commit_ (new (shared) simple_statement (conn, "COMMIT", 7)),
- rollback_ (new (shared) simple_statement (conn, "ROLLBACK", 9))
+ begin_ (new (shared) simple_statement (conn_, "BEGIN", 6)),
+ commit_ (new (shared) simple_statement (conn_, "COMMIT", 7)),
+ rollback_ (new (shared) simple_statement (conn_, "ROLLBACK", 9))
{
rollback_->cached (true);
commit_->cached (true);
begin_->cached (true);
}
+
+ void statement_cache::
+ begin_immediate_statement_ () const
+ {
+ begin_immediate_.reset (
+ new (shared) simple_statement (conn_, "BEGIN IMMEDIATE", 16));
+ begin_immediate_->cached (true);
+ }
+
+ void statement_cache::
+ begin_exclusive_statement_ () const
+ {
+ begin_exclusive_.reset (
+ new (shared) simple_statement (conn_, "BEGIN EXCLUSIVE", 16));
+ begin_exclusive_->cached (true);
+ }
}
}
diff --git a/odb/sqlite/statement-cache.hxx b/odb/sqlite/statement-cache.hxx
index 1b3d4b2..ca4ab2e 100644
--- a/odb/sqlite/statement-cache.hxx
+++ b/odb/sqlite/statement-cache.hxx
@@ -38,6 +38,24 @@ namespace odb
}
simple_statement&
+ begin_immediate_statement () const
+ {
+ if (!begin_immediate_)
+ begin_immediate_statement_ ();
+
+ return *begin_immediate_;
+ }
+
+ simple_statement&
+ begin_exclusive_statement () const
+ {
+ if (!begin_exclusive_)
+ begin_exclusive_statement_ ();
+
+ return *begin_exclusive_;
+ }
+
+ simple_statement&
commit_statement () const
{
return *commit_;
@@ -66,6 +84,13 @@ namespace odb
}
private:
+ void
+ begin_immediate_statement_ () const;
+
+ void
+ begin_exclusive_statement_ () const;
+
+ private:
typedef std::map<const std::type_info*,
details::shared_ptr<object_statements_base>,
details::type_info_comparator> map;
@@ -73,6 +98,8 @@ namespace odb
connection& conn_;
details::shared_ptr<simple_statement> begin_;
+ mutable details::shared_ptr<simple_statement> begin_immediate_;
+ mutable details::shared_ptr<simple_statement> begin_exclusive_;
details::shared_ptr<simple_statement> commit_;
details::shared_ptr<simple_statement> rollback_;
diff --git a/odb/sqlite/transaction-impl.cxx b/odb/sqlite/transaction-impl.cxx
index 36d6c2b..41254a1 100644
--- a/odb/sqlite/transaction-impl.cxx
+++ b/odb/sqlite/transaction-impl.cxx
@@ -14,10 +14,29 @@ namespace odb
namespace sqlite
{
transaction_impl::
- transaction_impl (database_type& db)
+ transaction_impl (database_type& db, lock l)
: odb::transaction_impl (db), connection_ (db.connection ())
{
- connection_->statement_cache ().begin_statement ().execute ();
+ statement_cache& c (connection_->statement_cache ());
+
+ switch (l)
+ {
+ case deferred:
+ {
+ c.begin_statement ().execute ();
+ break;
+ }
+ case immediate:
+ {
+ c.begin_immediate_statement ().execute ();
+ break;
+ }
+ case exclusive:
+ {
+ c.begin_exclusive_statement ().execute ();
+ break;
+ }
+ }
}
transaction_impl::
diff --git a/odb/sqlite/transaction-impl.hxx b/odb/sqlite/transaction-impl.hxx
index cc38039..3b09bcf 100644
--- a/odb/sqlite/transaction-impl.hxx
+++ b/odb/sqlite/transaction-impl.hxx
@@ -28,7 +28,14 @@ namespace odb
typedef sqlite::database database_type;
typedef sqlite::connection connection_type;
- transaction_impl (database_type&);
+ enum lock
+ {
+ deferred,
+ immediate,
+ exclusive
+ };
+
+ transaction_impl (database_type&, lock);
virtual
~transaction_impl ();