summaryrefslogtreecommitdiff
path: root/odb/relational/pgsql/source.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'odb/relational/pgsql/source.cxx')
-rw-r--r--odb/relational/pgsql/source.cxx53
1 files changed, 49 insertions, 4 deletions
diff --git a/odb/relational/pgsql/source.cxx b/odb/relational/pgsql/source.cxx
index 6bfa3d9..0ff0bf1 100644
--- a/odb/relational/pgsql/source.cxx
+++ b/odb/relational/pgsql/source.cxx
@@ -122,6 +122,10 @@ namespace relational
sk_ == statement_update)
return false;
+ if ((sk_ == statement_insert || sk_ == statement_update) &&
+ version (m))
+ return false;
+
if (!first)
os << ',' << endl;
@@ -164,7 +168,7 @@ namespace relational
os << "// " << mi.m.name () << endl
<< "//" << endl;
- if (inverse (mi.m, key_prefix_))
+ if (inverse (mi.m, key_prefix_) || version (mi.m))
os << "if (sk == statement_select)"
<< "{";
// If the whole class is readonly, then we will never be
@@ -209,7 +213,7 @@ namespace relational
<< "sk == statement_select ? 0 : ";
if (cc.inverse != 0)
- os << cc.inverse << "UL" << endl;
+ os << cc.inverse << "UL";
if (!ro && cc.readonly != 0)
{
@@ -233,7 +237,7 @@ namespace relational
// The same logic as in pre().
//
- if (inverse (mi.m, key_prefix_))
+ if (inverse (mi.m, key_prefix_) || version (mi.m))
block = true;
else if (!readonly (*context::top_object))
{
@@ -493,6 +497,12 @@ namespace relational
member = member_override_;
else
{
+ // If we are generating standard init() and this member
+ // contains version, ignore it.
+ //
+ if (version (mi.m))
+ return false;
+
string const& name (mi.m.name ());
member = "o." + name;
@@ -1001,6 +1011,7 @@ namespace relational
return;
semantics::data_member* id (id_member (c));
+ semantics::data_member* optimistic (context::optimistic (c));
column_count_type const& cc (column_count (c));
string const& n (c.fq_name ());
@@ -1028,6 +1039,12 @@ namespace relational
os << name_decl << endl
<< "erase_statement_name[] = " << strlit (fn + "_erase") << ";"
<< endl;
+
+ if (optimistic != 0)
+ os << name_decl << endl
+ << "optimistic_erase_statement_name[] = " <<
+ strlit (fn + "_optimistic_erase") << ";"
+ << endl;
}
// Query statement name.
@@ -1087,9 +1104,18 @@ namespace relational
st->traverse (c);
}
+ bool first (cc.total == cc.id + cc.inverse + cc.readonly +
+ cc.optimistic_managed);
+
{
instance<statement_oids> st (statement_where);
- st->traverse_column (*id, "", false);
+ st->traverse_column (*id, "", first);
+ }
+
+ if (optimistic != 0)
+ {
+ instance<statement_oids> st (statement_where);
+ st->traverse_column (*optimistic, "", false);
}
os << "};";
@@ -1108,6 +1134,25 @@ namespace relational
os << "};";
}
+
+ if (id != 0 && optimistic != 0)
+ {
+ os << oid_decl << endl
+ << "optimistic_erase_statement_types[] ="
+ << "{";
+
+ {
+ instance<statement_oids> st (statement_where);
+ st->traverse_column (*id, "", true);
+ }
+
+ {
+ instance<statement_oids> st (statement_where);
+ st->traverse_column (*optimistic, "", false);
+ }
+
+ os << "};";
+ }
}
virtual void