aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-08-10 11:18:31 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-08-10 11:18:31 +0200
commit3356c10f4e3d7af8e835f3e4e00ba29e0193c5e0 (patch)
treeca0fb7ba53d72b89fb2dcc747dd4110fc709dfaa
parent4a10b51f8cba871c594e4eefd9540a6d008cd957 (diff)
Add query support
-rw-r--r--odb/mysql/header.cxx36
-rw-r--r--odb/mysql/inline.cxx22
-rw-r--r--odb/mysql/source.cxx64
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<result_impl<object_type> >" << endl
+ << "query (database&, const query_type&);"
+ << endl;
+
+ // Helpers.
+ //
os << "private:" << endl
<< "static bool" << endl
<< "find (mysql::object_statements<object_type>&, const id_type&);";
@@ -420,9 +423,12 @@ namespace mysql
ctx.os << "#include <odb/core.hxx>" << endl
<< "#include <odb/traits.hxx>" << endl
<< "#include <odb/buffer.hxx>" << endl
+ << "#include <odb/shared-ptr.hxx>" << endl
+ << "#include <odb/result.hxx>" << endl
<< endl
<< "#include <odb/mysql/version.hxx>" << endl
<< "#include <odb/mysql/forward.hxx>" << endl
+ << "#include <odb/mysql/query.hxx>" << 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<result_impl< " << traits << "::object_type> >" << endl
+ << traits << "::" << endl
+ << "query (database&, const query_type& q)"
+ << "{"
+ << "using namespace mysql;"
+ << endl
+ << "connection& conn (mysql::transaction::current ().connection ());"
+ << "object_statements<object_type>& sts (" << endl
+ << "conn.statement_cache ().find<object_type> ());"
+ << endl
+ << "binding& imb (sts.image_binding ());"
+ << "if (imb.version == 0)" << endl
+ << "bind (imb, sts.image ());"
+ << endl
+ << "shared_ptr<query_statement> st (" << endl
+ << "new (shared) query_statement (conn," << endl
+ << "select_prefix + q.clause ()," << endl
+ << "imb," << endl
+ << "q.parameters ()));"
+ << "st->execute ();"
+ << endl
+ << "shared_ptr<odb::result_impl<object_type> > r (" << endl
+ << "new (shared) mysql::result_impl<object_type> (st, sts));"
+ << "return r;"
+ << "}";
}
private:
@@ -975,6 +1026,7 @@ namespace mysql
<< "#include <odb/mysql/transaction.hxx>" << endl
<< "#include <odb/mysql/connection.hxx>" << endl
<< "#include <odb/mysql/statement.hxx>" << endl
+ << "#include <odb/mysql/result.hxx>" << endl
<< "#include <odb/mysql/exceptions.hxx>" << endl
<< endl;