From dac72baef46897b80fc98632cef182fb266a5d60 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 21 Mar 2011 17:24:35 +0200 Subject: Add base SQLite database classes --- odb/sqlite/connection.cxx | 59 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 odb/sqlite/connection.cxx (limited to 'odb/sqlite/connection.cxx') diff --git a/odb/sqlite/connection.cxx b/odb/sqlite/connection.cxx new file mode 100644 index 0000000..37f5e20 --- /dev/null +++ b/odb/sqlite/connection.cxx @@ -0,0 +1,59 @@ +// file : odb/sqlite/connection.cxx +// author : Boris Kolpackov +// copyright : Copyright (c) 2005-2011 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +#include // std::bad_alloc +#include +#include + +#include +#include +#include +#include + +using namespace std; + +namespace odb +{ + namespace sqlite + { + connection:: + connection (database_type& db) + : db_ (db) + { + int f (db.flags ()); + const string& n (db.name ()); + + // If we are opening a temporary database, then add the create flag. + // + if (n.empty () || n == ":memory:") + f |= SQLITE_OPEN_CREATE; + + // A connection can only be used by a single thread at a time. So + // disable locking in SQLite unless explicitly requested. + // + if ((f & SQLITE_OPEN_FULLMUTEX) == 0) + f |= SQLITE_OPEN_NOMUTEX; + + if (int e = sqlite3_open_v2 (n.c_str (), &handle_, f, 0)) + { + if (handle_ == 0) + throw bad_alloc (); + + translate_error (e, *this); + } + + statement_cache_.reset (new statement_cache_type (*this)); + } + + connection:: + ~connection () + { + statement_cache_.reset (); // Free prepared statements. + + if (sqlite3_close (handle_) == SQLITE_BUSY) + assert (false); // Connection has outstanding prepared statements. + } + } +} -- cgit v1.1