summaryrefslogtreecommitdiff
path: root/odb
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2023-01-11 14:40:02 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2023-01-11 14:40:02 +0200
commit5652354aa256426c5ab32c4a1c5687e5509af868 (patch)
treeac59964abb8696c12ec4ea71c56e9219dd4245e6 /odb
parent2a7a60a29cc72f07263ec7534732141f8869b5ed (diff)
Add support for custom table definition options
Diffstat (limited to 'odb')
-rw-r--r--odb/context.cxx84
-rw-r--r--odb/context.hxx8
-rw-r--r--odb/relational/model.hxx8
-rw-r--r--odb/relational/mysql/model.cxx34
4 files changed, 126 insertions, 8 deletions
diff --git a/odb/context.cxx b/odb/context.cxx
index e220d0e..dd4019a 100644
--- a/odb/context.cxx
+++ b/odb/context.cxx
@@ -2130,6 +2130,90 @@ table_name (semantics::data_member& m, table_prefix const& p) const
return r;
}
+string context::
+table_options (semantics::class_& c)
+{
+ string r;
+
+ // Accumulate options from class.
+ //
+ // @@ Should we also get them from bases?
+ //
+ // @@ Note for some databases (like SQLite), options are seperated with
+ // comma, not space. Likely the same issue in the column_options().
+ //
+ if (c.count ("options"))
+ {
+ strings const& o (c.get<strings> ("options"));
+
+ for (strings::const_iterator i (o.begin ()); i != o.end (); ++i)
+ {
+ if (i->empty ())
+ r.clear ();
+ else
+ {
+ if (!r.empty ())
+ r += ' ';
+
+ r += *i;
+ }
+ }
+ }
+
+ return r;
+}
+
+string context::
+table_options (semantics::data_member& m, semantics::type& c)
+{
+ string r;
+
+ // Accumulate options from container and member.
+ //
+ // @@ Currently there is no way to assign options to the container type. If
+ // we use the value specifier, then it ends up being treated as a value
+ // type. To support this we will probably need to invent the container
+ // specifier.
+ //
+ if (c.count ("options"))
+ {
+ strings const& o (c.get<strings> ("options"));
+
+ for (strings::const_iterator i (o.begin ()); i != o.end (); ++i)
+ {
+ if (i->empty ())
+ r.clear ();
+ else
+ {
+ if (!r.empty ())
+ r += ' ';
+
+ r += *i;
+ }
+ }
+ }
+
+ if (m.count ("options"))
+ {
+ strings const& o (m.get<strings> ("options"));
+
+ for (strings::const_iterator i (o.begin ()); i != o.end (); ++i)
+ {
+ if (i->empty ())
+ r.clear ();
+ else
+ {
+ if (!r.empty ())
+ r += ' ';
+
+ r += *i;
+ }
+ }
+ }
+
+ return r;
+}
+
// context::column_prefix
//
context::column_prefix::
diff --git a/odb/context.hxx b/odb/context.hxx
index d10d555..ec4505b 100644
--- a/odb/context.hxx
+++ b/odb/context.hxx
@@ -1342,6 +1342,14 @@ public:
qname
table_name (semantics::data_member&, table_prefix const&) const;
+ string
+ table_options (semantics::class_&);
+
+ // Table options for the container member.
+ //
+ string
+ table_options (semantics::data_member&, semantics::type& ct);
+
//
//
struct column_prefix
diff --git a/odb/relational/model.hxx b/odb/relational/model.hxx
index b7a07ea..fdfa8fd 100644
--- a/odb/relational/model.hxx
+++ b/odb/relational/model.hxx
@@ -555,9 +555,9 @@ namespace relational
}
virtual string
- table_options (semantics::data_member&, semantics::type&)
+ table_options (semantics::data_member& m, semantics::type& ct)
{
- return "";
+ return context::table_options (m, ct);
}
virtual void
@@ -784,9 +784,9 @@ namespace relational
class_ (sema_rel::model& model): model_ (model) {}
virtual string
- table_options (type&)
+ table_options (type& c)
{
- return "";
+ return context::table_options (c);
}
virtual void
diff --git a/odb/relational/mysql/model.cxx b/odb/relational/mysql/model.cxx
index 2ec9d8b..17ed4c0 100644
--- a/odb/relational/mysql/model.cxx
+++ b/odb/relational/mysql/model.cxx
@@ -110,10 +110,23 @@ namespace relational
member_create (base const& x): base (x) {}
virtual string
- table_options (semantics::data_member&, semantics::type&)
+ table_options (semantics::data_member& m, semantics::type& c)
{
+ string r (relational::member_create::table_options (m, c));
+
string const& engine (options.mysql_engine ());
- return engine != "default" ? "ENGINE=" + engine : "";
+ if (engine != "default")
+ {
+ // Note: MySQL table options can be separated with spaces.
+ //
+ if (!r.empty ())
+ r += ' ';
+
+ r += "ENGINE=";
+ r += engine;
+ }
+
+ return r;
}
};
entry<member_create> member_create_;
@@ -123,10 +136,23 @@ namespace relational
class_ (base const& x): base (x) {}
virtual string
- table_options (type&)
+ table_options (type& c)
{
+ string r (relational::class_::table_options (c));
+
string const& engine (options.mysql_engine ());
- return engine != "default" ? "ENGINE=" + engine : "";
+ if (engine != "default")
+ {
+ // Note: MySQL table options can be separated with spaces.
+ //
+ if (!r.empty ())
+ r += ' ';
+
+ r += "ENGINE=";
+ r += engine;
+ }
+
+ return r;
}
};
entry<class_> class__;