From 3356c10f4e3d7af8e835f3e4e00ba29e0193c5e0 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 10 Aug 2010 11:18:31 +0200 Subject: Add query support --- odb/mysql/header.cxx | 36 +++++++++++++++++------------ odb/mysql/inline.cxx | 22 ++++++++++++++++++ odb/mysql/source.cxx | 64 +++++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 101 insertions(+), 21 deletions(-) diff --git a/odb/mysql/header.cxx b/odb/mysql/header.cxx index 6274476..c3222bc 100644 --- a/odb/mysql/header.cxx +++ b/odb/mysql/header.cxx @@ -259,14 +259,6 @@ namespace mysql throw generation_failed (); } - bool has_grow; - { - has_grow_member m (*this); - traversal::names n (m); - names (c, n); - has_grow = m.result (); - } - os << "// " << c.name () << endl << "//" << endl; @@ -277,7 +269,7 @@ namespace mysql << "{" << "public:" << endl; - // object_type & shared_ptr + // object_type // os << "typedef " << type << " object_type;"; @@ -286,6 +278,11 @@ namespace mysql os << "typedef " << id_type.fq_name () << " id_type;" << endl; + // query_type + // + os << "typedef mysql::query query_type;" + << endl; + // image_type // image_type_.traverse (c); @@ -311,6 +308,7 @@ namespace mysql << "static const char* const select_query;" << "static const char* const update_query;" << "static const char* const delete_query;" + << "static const char* const select_prefix;" << endl; // id () @@ -321,12 +319,9 @@ namespace mysql // grow () // - if (has_grow) - { - os << "static bool" << endl - << "grow (image_type&, my_bool*);" - << endl; - } + os << "static bool" << endl + << "grow (image_type&, my_bool*);" + << endl; // bind (image_type) // @@ -380,6 +375,14 @@ namespace mysql << "find (database&, const id_type&, object_type&);" << endl; + // query () + // + os << "static shared_ptr >" << endl + << "query (database&, const query_type&);" + << endl; + + // Helpers. + // os << "private:" << endl << "static bool" << endl << "find (mysql::object_statements&, const id_type&);"; @@ -420,9 +423,12 @@ namespace mysql ctx.os << "#include " << endl << "#include " << endl << "#include " << endl + << "#include " << endl + << "#include " << endl << endl << "#include " << endl << "#include " << endl + << "#include " << endl << endl; ctx.os << "namespace odb" diff --git a/odb/mysql/inline.cxx b/odb/mysql/inline.cxx index 8388cac..19b1b41 100644 --- a/odb/mysql/inline.cxx +++ b/odb/mysql/inline.cxx @@ -33,6 +33,14 @@ namespace mysql t.traverse (c); semantics::data_member& id (*t.member ()); + bool has_grow; + { + has_grow_member m (*this); + traversal::names n (m); + names (c, n); + has_grow = m.result (); + } + os << "// " << c.name () << endl << "//" << endl << endl; @@ -46,6 +54,20 @@ namespace mysql << "{" << "return obj." << id.name () << ";" << endl << "}"; + + // grow () + // + if (!has_grow) + { + // The dummy implementation is needed for result_impl. + // + os << "inline" << endl + << "bool " << traits << "::" << endl + << "grow (image_type&, my_bool*)" + << "{" + << "return false;" + << "}"; + } } }; } diff --git a/odb/mysql/source.cxx b/odb/mysql/source.cxx index 824eace..7d42b30 100644 --- a/odb/mysql/source.cxx +++ b/odb/mysql/source.cxx @@ -149,8 +149,12 @@ namespace mysql { os << b << ".buffer_type = " << date_time_buffer_types[t.type - sql_type::DATE] << ";" - << b << ".buffer = &i." << var << "value;" - << b << ".is_null = &i." << var << "null;" + << b << ".buffer = &i." << var << "value;"; + + if (t.type == sql_type::YEAR) + os << b << ".is_unsigned = 0;"; + + os << b << ".is_null = &i." << var << "null;" << endl; } @@ -685,7 +689,8 @@ namespace mysql for (size_t i (0); i < column_count; ++i) os << (i != 0 ? "," : "") << '?'; - os << ")\";" << endl; + os << ")\";" + << endl; // select_query // @@ -700,7 +705,8 @@ namespace mysql os << "\"" << endl << "\" FROM `" << table_name (c) << "` WHERE `" << - column_name (id) << "` = ?\";" << endl; + column_name (id) << "` = ?\";" + << endl; // update_query // @@ -714,13 +720,30 @@ namespace mysql } os << "\"" << endl - << "\" WHERE `" << column_name (id) << "` = ?\";" << endl; + << "\" WHERE `" << column_name (id) << "` = ?\";" + << endl; // delete_query // os << "const char* const " << traits << "::delete_query =" << endl << "\"DELETE FROM `" << table_name (c) << "`\"" << endl - << "\" WHERE `" << column_name (id) << "` = ?\";" << endl; + << "\" WHERE `" << column_name (id) << "` = ?\";" + << endl; + + // select_prefix + // + os << "const char* const " << traits << "::select_prefix =" << endl + << "\"SELECT \"" << endl; + + { + member_column m (*this); + traversal::names n (m); + names (c, n); + } + + os << "\"" << endl + << "\" FROM `" << table_name (c) << "` \";" + << endl; // grow () // @@ -937,6 +960,34 @@ namespace mysql os << "st.free_result ();" << "return true;" << "}"; + + // query () + // + os << "shared_ptr >" << endl + << traits << "::" << endl + << "query (database&, const query_type& q)" + << "{" + << "using namespace mysql;" + << endl + << "connection& conn (mysql::transaction::current ().connection ());" + << "object_statements& sts (" << endl + << "conn.statement_cache ().find ());" + << endl + << "binding& imb (sts.image_binding ());" + << "if (imb.version == 0)" << endl + << "bind (imb, sts.image ());" + << endl + << "shared_ptr st (" << endl + << "new (shared) query_statement (conn," << endl + << "select_prefix + q.clause ()," << endl + << "imb," << endl + << "q.parameters ()));" + << "st->execute ();" + << endl + << "shared_ptr > r (" << endl + << "new (shared) mysql::result_impl (st, sts));" + << "return r;" + << "}"; } private: @@ -975,6 +1026,7 @@ namespace mysql << "#include " << endl << "#include " << endl << "#include " << endl + << "#include " << endl << "#include " << endl << endl; -- cgit v1.1