summaryrefslogtreecommitdiff
path: root/odb/mysql/statement.hxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-11-06 18:00:43 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-11-06 18:00:43 +0200
commit5daaa1a6d9c8f5d3a4ad3d7009df564bc6506424 (patch)
treeb96d205208587208a4e443be192fe264d2f53d57 /odb/mysql/statement.hxx
parent6fd2fb44263eb6704905cddcc607462c21c5e687 (diff)
Add support for container persistence
Generalize statements that were used for persisting objects to work for both objects and containers. Implement a cache for container statements.
Diffstat (limited to 'odb/mysql/statement.hxx')
-rw-r--r--odb/mysql/statement.hxx328
1 files changed, 39 insertions, 289 deletions
diff --git a/odb/mysql/statement.hxx b/odb/mysql/statement.hxx
index bdeee7a..3df86c0 100644
--- a/odb/mysql/statement.hxx
+++ b/odb/mysql/statement.hxx
@@ -8,16 +8,14 @@
#include <odb/pre.hxx>
-#include <map>
#include <string>
#include <cstddef> // std::size_t
-#include <typeinfo>
#include <odb/forward.hxx>
-#include <odb/traits.hxx>
#include <odb/mysql/mysql.hxx>
#include <odb/mysql/version.hxx>
+#include <odb/mysql/binding.hxx>
#include <odb/details/shared-ptr.hxx>
@@ -29,23 +27,6 @@ namespace odb
{
class connection;
- class LIBODB_MYSQL_EXPORT binding
- {
- public:
- binding (MYSQL_BIND* b, std::size_t n)
- : bind (b), count (n), version (0)
- {
- }
-
- MYSQL_BIND* bind;
- std::size_t count;
- std::size_t version;
-
- private:
- binding (const binding&);
- binding& operator= (const binding&);
- };
-
class LIBODB_MYSQL_EXPORT statement: public details::shared_base
{
public:
@@ -66,16 +47,16 @@ namespace odb
MYSQL_STMT* stmt_;
};
- class LIBODB_MYSQL_EXPORT query_statement: public statement
+ class LIBODB_MYSQL_EXPORT select_statement: public statement
{
public:
virtual
- ~query_statement ();
+ ~select_statement ();
- query_statement (connection& conn,
- const std::string& statement,
- binding& image,
- MYSQL_BIND* parameters);
+ select_statement (connection& conn,
+ const std::string& statement,
+ binding& cond,
+ binding& data);
enum result
{
success,
@@ -105,90 +86,51 @@ namespace odb
cancel ();
private:
- query_statement (const query_statement&);
- query_statement& operator= (const query_statement&);
+ select_statement (const select_statement&);
+ select_statement& operator= (const select_statement&);
private:
bool end_;
bool cached_;
std::size_t rows_;
- binding& image_;
- std::size_t image_version_;
+ binding& cond_;
+ std::size_t cond_version_;
- MYSQL_BIND* parameters_;
+ binding& data_;
+ std::size_t data_version_;
};
- class LIBODB_MYSQL_EXPORT persist_statement: public statement
+ class LIBODB_MYSQL_EXPORT insert_statement: public statement
{
public:
virtual
- ~persist_statement ();
+ ~insert_statement ();
- persist_statement (connection& conn,
- const std::string& statement,
- binding& image);
+ insert_statement (connection& conn,
+ const std::string& statement,
+ binding& data);
- void
- execute ();
+ // Return true if successful and false if the row is a duplicate.
+ // All other errors are reported by throwing exceptions.
+ //
+ bool
+ execute ();
unsigned long long
id ()
{
- return mysql_stmt_insert_id (stmt_);
+ return static_cast<unsigned long long> (
+ mysql_stmt_insert_id (stmt_));
}
private:
- persist_statement (const persist_statement&);
- persist_statement& operator= (const persist_statement&);
+ insert_statement (const insert_statement&);
+ insert_statement& operator= (const insert_statement&);
private:
- binding& image_;
- std::size_t version_;
- };
-
- class LIBODB_MYSQL_EXPORT find_statement: public statement
- {
- public:
- virtual
- ~find_statement ();
-
- find_statement (connection& conn,
- const std::string& statement,
- binding& id,
- binding& image);
- enum result
- {
- success,
- no_data,
- truncated
- };
-
- // You are expected to call free_result() if this function
- // returns success or truncated.
- //
- result
- execute ();
-
- void
- refetch ();
-
- void
- free_result ();
-
- void
- cancel ();
-
- private:
- find_statement (const find_statement&);
- find_statement& operator= (const find_statement&);
-
- private:
- binding& id_;
- std::size_t id_version_;
-
- binding& image_;
- std::size_t image_version_;
+ binding& data_;
+ std::size_t data_version_;
};
class LIBODB_MYSQL_EXPORT update_statement: public statement
@@ -216,222 +158,30 @@ namespace odb
std::size_t image_version_;
};
- class LIBODB_MYSQL_EXPORT erase_statement: public statement
+ class LIBODB_MYSQL_EXPORT delete_statement: public statement
{
public:
virtual
- ~erase_statement ();
+ ~delete_statement ();
- erase_statement (connection& conn,
- const std::string& statement,
- binding& id);
+ delete_statement (connection& conn,
+ const std::string& statement,
+ binding& cond);
- void
+ unsigned long long
execute ();
private:
- erase_statement (const erase_statement&);
- erase_statement& operator= (const erase_statement&);
-
- private:
- binding& id_;
- std::size_t version_;
- };
-
- // Statement cache.
- //
-
- class LIBODB_MYSQL_EXPORT object_statements_base:
- public details::shared_base
- {
- public:
- virtual
- ~object_statements_base ();
-
- protected:
- object_statements_base (connection& conn)
- : conn_ (conn)
- {
- }
-
- protected:
- connection& conn_;
- };
-
- template <typename T>
- class object_statements: public object_statements_base
- {
- public:
- typedef odb::object_traits<T> object_traits;
- typedef typename object_traits::image_type image_type;
- typedef typename object_traits::id_image_type id_image_type;
-
- typedef mysql::persist_statement persist_statement_type;
- typedef mysql::find_statement find_statement_type;
- typedef mysql::update_statement update_statement_type;
- typedef mysql::erase_statement erase_statement_type;
-
- object_statements (connection&);
-
- image_type&
- image ()
- {
- return image_;
- }
-
- binding&
- image_binding ()
- {
- return image_binding_;
- }
-
- my_bool*
- image_error ()
- {
- return image_error_;
- }
-
- id_image_type&
- id_image ()
- {
- return id_image_;
- }
-
- binding&
- id_image_binding ()
- {
- return id_image_binding_;
- }
-
- persist_statement_type&
- persist_statement ()
- {
- if (persist_ == 0)
- persist_.reset (
- new (details::shared) persist_statement_type (
- conn_, object_traits::persist_statement, image_binding_));
-
- return *persist_;
- }
-
- find_statement_type&
- find_statement ()
- {
- if (find_ == 0)
- find_.reset (
- new (details::shared) find_statement_type (
- conn_,
- object_traits::find_statement,
- id_image_binding_,
- image_binding_));
-
- return *find_;
- }
-
- update_statement_type&
- update_statement ()
- {
- if (update_ == 0)
- update_.reset (
- new (details::shared) update_statement_type (
- conn_,
- object_traits::update_statement,
- id_image_binding_,
- image_binding_));
-
- return *update_;
- }
-
- erase_statement_type&
- erase_statement ()
- {
- if (erase_ == 0)
- erase_.reset (
- new (details::shared) erase_statement_type (
- conn_,
- object_traits::erase_statement,
- id_image_binding_));
-
- return *erase_;
- }
-
- private:
- object_statements (const object_statements&);
- object_statements& operator= (const object_statements&);
+ delete_statement (const delete_statement&);
+ delete_statement& operator= (const delete_statement&);
private:
- // The last element is the id parameter. The update statement
- // depends on this being one contiguous arrays.
- //
- MYSQL_BIND image_bind_[object_traits::column_count + 1];
-
- image_type image_;
- my_bool image_error_[object_traits::column_count];
- binding image_binding_;
-
- id_image_type id_image_;
- binding id_image_binding_;
-
- details::shared_ptr<persist_statement_type> persist_;
- details::shared_ptr<find_statement_type> find_;
- details::shared_ptr<update_statement_type> update_;
- details::shared_ptr<erase_statement_type> erase_;
- };
-
- struct LIBODB_MYSQL_EXPORT type_info_comparator
- {
- bool
- operator() (const std::type_info* x, const std::type_info* y) const
- {
- // XL C++ on AIX has buggy type_info::before() in that
- // it returns true for two different type_info objects
- // that happened to be for the same type.
- //
-#if defined(__xlC__) && defined(_AIX)
- return *x != *y && x->before (*y);
-#else
- return x->before (*y);
-#endif
- }
- };
-
- class LIBODB_MYSQL_EXPORT statement_cache
- {
- public:
- statement_cache (connection& conn)
- : conn_ (conn)
- {
- }
-
- template <typename T>
- object_statements<T>&
- find ()
- {
- map::iterator i (map_.find (&typeid (T)));
-
- if (i != map_.end ())
- return static_cast<object_statements<T>&> (*i->second);
-
- details::shared_ptr<object_statements<T> > p (
- new (details::shared) object_statements<T> (conn_));
-
- map_.insert (map::value_type (&typeid (T), p));
- return *p;
- }
-
- private:
- typedef std::map<const std::type_info*,
- details::shared_ptr<object_statements_base>,
- type_info_comparator> map;
-
- connection& conn_;
- map map_;
+ binding& cond_;
+ std::size_t cond_version_;
};
}
}
-#include <odb/mysql/statement.txx>
-
#include <odb/post.hxx>
#endif // ODB_MYSQL_STATEMENT_HXX