aboutsummaryrefslogtreecommitdiff
path: root/odb/mysql
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-11-24 10:18:09 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-11-24 10:18:09 +0200
commit19ba163feb74def218861b4b3981e713b358d1c8 (patch)
treee35276b0db3a3e4727195831b5ad1628c12aaeba /odb/mysql
parentb336ef0bfdf12e5ca837962d08b718605f5979b3 (diff)
Add support for unordered storage of ordered containers
New pragma: unordered.
Diffstat (limited to 'odb/mysql')
-rw-r--r--odb/mysql/header.cxx47
-rw-r--r--odb/mysql/schema.cxx5
-rw-r--r--odb/mysql/source.cxx160
3 files changed, 149 insertions, 63 deletions
diff --git a/odb/mysql/header.cxx b/odb/mysql/header.cxx
index 4d604a4..119219a 100644
--- a/odb/mysql/header.cxx
+++ b/odb/mysql/header.cxx
@@ -244,11 +244,17 @@ namespace mysql
type* it (0);
type* kt (0);
+ bool ordered (false);
+
switch (ck)
{
case ck_ordered:
{
- it = &container_it (t);
+ if (!m.count ("unordered"))
+ {
+ it = &container_it (t);
+ ordered = true;
+ }
break;
}
case ck_map:
@@ -276,8 +282,11 @@ namespace mysql
{
// Add one for the index.
//
- data_columns++;
- cond_columns++;
+ if (ordered)
+ {
+ data_columns++;
+ cond_columns++;
+ }
break;
}
case ck_map:
@@ -410,10 +419,13 @@ namespace mysql
{
case ck_ordered:
{
- os << "// index" << endl
- << "//" << endl;
- image_member im (*this, "index_", *it, "index_type", "index");
- im.traverse (m);
+ if (ordered)
+ {
+ os << "// index" << endl
+ << "//" << endl;
+ image_member im (*this, "index_", *it, "index_type", "index");
+ im.traverse (m);
+ }
break;
}
case ck_map:
@@ -448,10 +460,13 @@ namespace mysql
{
case ck_ordered:
{
- os << "// index" << endl
- << "//" << endl;
- image_member im (*this, "index_", *it, "index_type", "index");
- im.traverse (m);
+ if (ordered)
+ {
+ os << "// index" << endl
+ << "//" << endl;
+ image_member im (*this, "index_", *it, "index_type", "index");
+ im.traverse (m);
+ }
break;
}
case ck_map:
@@ -511,7 +526,10 @@ namespace mysql
{
case ck_ordered:
{
- os << "init (data_image_type&, index_type, const value_type&);";
+ if (ordered)
+ os << "init (data_image_type&, index_type, const value_type&);";
+ else
+ os << "init (data_image_type&, const value_type&);";
break;
}
case ck_map:
@@ -538,7 +556,10 @@ namespace mysql
{
case ck_ordered:
{
- os << "init (index_type&, value_type&, ";
+ if (ordered)
+ os << "init (index_type&, value_type&, ";
+ else
+ os << "init (value_type&, ";
break;
}
case ck_map:
diff --git a/odb/mysql/schema.cxx b/odb/mysql/schema.cxx
index 0007121..ce2c350 100644
--- a/odb/mysql/schema.cxx
+++ b/odb/mysql/schema.cxx
@@ -89,7 +89,8 @@ namespace mysql
// index (simple value)
//
string index_name;
- if (ck == ck_ordered)
+ bool ordered (ck == ck_ordered && !m.count ("unordered"));
+ if (ordered)
{
index_name = column_name (m, "index", "index");
@@ -143,7 +144,7 @@ namespace mysql
// index index
//
- if (ck == ck_ordered)
+ if (ordered)
os << "," << endl
<< " INDEX (`" << index_name << "`)";
diff --git a/odb/mysql/source.cxx b/odb/mysql/source.cxx
index bdcae1b..60f5104 100644
--- a/odb/mysql/source.cxx
+++ b/odb/mysql/source.cxx
@@ -1103,14 +1103,19 @@ namespace mysql
type* it (0);
type* kt (0);
+ bool ordered (false);
bool grow (false);
switch (ck)
{
case ck_ordered:
{
- it = &container_it (t);
- grow = grow || context::grow (m, *it, "index");
+ if (!m.count ("unordered"))
+ {
+ it = &container_it (t);
+ ordered = true;
+ grow = grow || context::grow (m, *it, "index");
+ }
break;
}
case ck_map:
@@ -1154,8 +1159,11 @@ namespace mysql
{
case ck_ordered:
{
- os << ",\"" << endl
- << "\"`" << column_name (m, "index", "index") << "`";
+ if (ordered)
+ {
+ os << ",\"" << endl
+ << "\"`" << column_name (m, "index", "index") << "`";
+ }
break;
}
case ck_map:
@@ -1210,8 +1218,11 @@ namespace mysql
{
case ck_ordered:
{
- os << ",\"" << endl
- << "\"`" << column_name (m, "index", "index") << "`";
+ if (ordered)
+ {
+ os << ",\"" << endl
+ << "\"`" << column_name (m, "index", "index") << "`";
+ }
break;
}
case ck_map:
@@ -1251,7 +1262,7 @@ namespace mysql
<< "\" FROM `" << table << "` WHERE `" <<
column_name (m, "id", "object_id") << "` = ?\"" << endl;
- if (ck == ck_ordered)
+ if (ordered)
os << "\" ORDER BY `" << column_name (m, "index", "index") << "`\"";
os << ";"
@@ -1278,6 +1289,8 @@ namespace mysql
os << "void " << scope << "::" << endl
<< "bind (MYSQL_BIND* b, id_image_type* p, cond_image_type& c)"
<< "{"
+ << "ODB_POTENTIALLY_UNUSED (c);"
+ << endl
<< "std::size_t n (0);"
<< endl;
@@ -1298,10 +1311,14 @@ namespace mysql
{
case ck_ordered:
{
- os << "// index" << endl
- << "//" << endl;
- bind_member bm (*this, "index_", "c", *it, "index_type", "index");
- bm.traverse (m);
+ if (ordered)
+ {
+ os << "// index" << endl
+ << "//" << endl;
+ bind_member bm (
+ *this, "index_", "c", *it, "index_type", "index");
+ bm.traverse (m);
+ }
break;
}
case ck_map:
@@ -1348,12 +1365,16 @@ namespace mysql
{
case ck_ordered:
{
- os << "// index" << endl
- << "//" << endl;
- bind_member bm (*this, "index_", "d", *it, "index_type", "index");
- bm.traverse (m);
- os << "n++;" // Simple value.
- << endl;
+ if (ordered)
+ {
+ os << "// index" << endl
+ << "//" << endl;
+ bind_member bm (
+ *this, "index_", "d", *it, "index_type", "index");
+ bm.traverse (m);
+ os << "n++;" // Simple value.
+ << endl;
+ }
break;
}
case ck_map:
@@ -1405,11 +1426,14 @@ namespace mysql
{
case ck_ordered:
{
- os << "// index" << endl
- << "//" << endl;
- grow_member gm (
- *this, index, "index_", *it, "index_type", "index");
- gm.traverse (m);
+ if (ordered)
+ {
+ os << "// index" << endl
+ << "//" << endl;
+ grow_member gm (
+ *this, index, "index_", *it, "index_type", "index");
+ gm.traverse (m);
+ }
break;
}
case ck_map:
@@ -1446,16 +1470,24 @@ namespace mysql
{
case ck_ordered:
{
- os << "init (data_image_type& i, index_type j, const value_type& v)"
- << "{"
- << "bool grew (false);"
- << endl
- << "// index" << endl
- << "//" << endl;
+ if (ordered)
+ os << "init (data_image_type& i, index_type j, const value_type& v)";
+ else
+ os << "init (data_image_type& i, const value_type& v)";
- init_image_member im (
- *this, "index_", "j", *it, "index_type", "index");
- im.traverse (m);
+ os<< "{"
+ << "bool grew (false);"
+ << endl;
+
+ if (ordered)
+ {
+ os << "// index" << endl
+ << "//" << endl;
+
+ init_image_member im (
+ *this, "index_", "j", *it, "index_type", "index");
+ im.traverse (m);
+ }
break;
}
@@ -1506,17 +1538,26 @@ namespace mysql
{
case ck_ordered:
{
- os << "init (index_type& j, value_type& v, " <<
- "const data_image_type& i, database& db)"
- << "{"
+ if (ordered)
+ os << "init (index_type& j, value_type& v, " <<
+ "const data_image_type& i, database& db)";
+ else
+ os << "init (value_type& v, const data_image_type& i, " <<
+ "database& db)";
+
+ os << "{"
<< "ODB_POTENTIALLY_UNUSED (db);"
- << endl
- << "// index" << endl
- << "//" << endl;
+ << endl;
- init_value_member im (
- *this, "index_", "j", *it, "index_type", "index");
- im.traverse (m);
+ if (ordered)
+ {
+ os << "// index" << endl
+ << "//" << endl;
+
+ init_value_member im (
+ *this, "index_", "j", *it, "index_type", "index");
+ im.traverse (m);
+ }
break;
}
@@ -1568,7 +1609,8 @@ namespace mysql
{
case ck_ordered:
{
- os << "insert_one (index_type i, const value_type& v, void* d)";
+ os << "insert_one (index_type" << (ordered ? " i" : "") <<
+ ", const value_type& v, void* d)";
break;
}
case ck_map:
@@ -1598,7 +1640,7 @@ namespace mysql
{
case ck_ordered:
{
- os << "init (di, i, v);";
+ os << "init (di, " << (ordered ? "i, " : "") << "v);";
break;
}
case ck_map:
@@ -1635,7 +1677,8 @@ namespace mysql
{
case ck_ordered:
{
- os << "load_all (index_type& i, value_type& v, void* d)";
+ os << "load_all (index_type&" << (ordered ? " i" : "") <<
+ ", value_type& v, void* d)";
break;
}
case ck_map:
@@ -1665,7 +1708,8 @@ namespace mysql
{
case ck_ordered:
{
- os << "init (i, v, di, sts.connection ().database ());"
+ os << "init (" << (ordered ? "i, " : "") <<
+ "v, di, sts.connection ().database ());"
<< endl;
break;
}
@@ -1762,7 +1806,12 @@ namespace mysql
<< "b.version++;"
<< "}"
<< "sts.id_image (id);"
- << "container_traits::persist (c, sts.functions ());"
+ << "functions_type& fs (sts.functions ());";
+
+ if (ck == ck_ordered)
+ os << "fs.ordered (" << (ordered ? "true" : "false") << ");";
+
+ os << "container_traits::persist (c, fs);"
<< "}";
// load
@@ -1821,7 +1870,12 @@ namespace mysql
<< "st.free_result ();"
<< endl
<< "sts.id_image (id);"
- << "container_traits::load (c, more, sts.functions ());"
+ << "functions_type& fs (sts.functions ());";
+
+ if (ck == ck_ordered)
+ os << "fs.ordered (" << (ordered ? "true" : "false") << ");";
+
+ os << "container_traits::load (c, more, fs);"
<< "}";
// update
@@ -1851,7 +1905,12 @@ namespace mysql
<< "cb.version++;"
<< "}"
<< "sts.id_image (id);"
- << "container_traits::update (c, sts.functions ());"
+ << "functions_type& fs (sts.functions ());";
+
+ if (ck == ck_ordered)
+ os << "fs.ordered (" << (ordered ? "true" : "false") << ");";
+
+ os << "container_traits::update (c, fs);"
<< "}";
// erase
@@ -1869,7 +1928,12 @@ namespace mysql
<< "b.version++;"
<< "}"
<< "sts.id_image (id);"
- << "container_traits::erase (sts.functions ());"
+ << "functions_type& fs (sts.functions ());";
+
+ if (ck == ck_ordered)
+ os << "fs.ordered (" << (ordered ? "true" : "false") << ");";
+
+ os << "container_traits::erase (fs);"
<< "}";
}