summaryrefslogtreecommitdiff
path: root/odb/mysql/database.cxx
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2024-01-25 18:52:59 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2024-01-25 18:52:59 +0300
commit3a160a80c788d81e48acf19a2cf68f29cf125dae (patch)
tree8bf000b3ae959d56367c15aa214a95d24b096905 /odb/mysql/database.cxx
parent35bdfb3e3604527f36f046928324346e8b37b46b (diff)
Turn libodb-mysql repository into package for muti-package repositorylibodb-mysql
Diffstat (limited to 'odb/mysql/database.cxx')
-rw-r--r--odb/mysql/database.cxx357
1 files changed, 0 insertions, 357 deletions
diff --git a/odb/mysql/database.cxx b/odb/mysql/database.cxx
deleted file mode 100644
index 6c0f1d6..0000000
--- a/odb/mysql/database.cxx
+++ /dev/null
@@ -1,357 +0,0 @@
-// file : odb/mysql/database.cxx
-// license : GNU GPL v2; see accompanying LICENSE file
-
-#include <sstream>
-#include <cstring> // std::memset
-
-#include <odb/mysql/mysql.hxx>
-#include <odb/mysql/database.hxx>
-#include <odb/mysql/connection.hxx>
-#include <odb/mysql/connection-factory.hxx>
-#include <odb/mysql/transaction.hxx>
-#include <odb/mysql/statement.hxx>
-#include <odb/mysql/exceptions.hxx>
-
-#include <odb/mysql/details/options.hxx>
-
-using namespace std;
-
-namespace odb
-{
- namespace mysql
- {
- using odb::details::transfer_ptr;
-
- database::
- ~database ()
- {
- }
-
- database::
- database (const char* user,
- const char* passwd,
- const char* db,
- const char* host,
- unsigned int port,
- const char* socket,
- const char* charset,
- unsigned long client_flags,
- transfer_ptr<connection_factory> factory)
- : odb::database (id_mysql),
- user_ (user ? user : ""),
- passwd_str_ (passwd ? passwd : ""),
- passwd_ (passwd ? passwd_str_.c_str () : 0),
- db_ (db ? db : ""),
- host_ (host ? host : ""),
- port_ (port),
- socket_str_ (socket ? socket : ""),
- socket_ (socket ? socket_str_.c_str () : 0),
- charset_ (charset == 0 ? "" : charset),
- client_flags_ (client_flags),
- factory_ (factory.transfer ())
- {
- if (!factory_)
- factory_.reset (new connection_pool_factory ());
-
- factory_->database (*this);
- }
-
- database::
- database (const string& user,
- const string& passwd,
- const string& db,
- const string& host,
- unsigned int port,
- const string* socket,
- const string& charset,
- unsigned long client_flags,
- transfer_ptr<connection_factory> factory)
- : odb::database (id_mysql),
- user_ (user),
- passwd_str_ (passwd),
- passwd_ (passwd_str_.c_str ()),
- db_ (db),
- host_ (host),
- port_ (port),
- socket_str_ (socket ? *socket : ""),
- socket_ (socket ? socket_str_.c_str () : 0),
- charset_ (charset),
- client_flags_ (client_flags),
- factory_ (factory.transfer ())
- {
- if (!factory_)
- factory_.reset (new connection_pool_factory ());
-
- factory_->database (*this);
- }
-
- database::
- database (const string& user,
- const string* passwd,
- const string& db,
- const string& host,
- unsigned int port,
- const string* socket,
- const string& charset,
- unsigned long client_flags,
- transfer_ptr<connection_factory> factory)
- : odb::database (id_mysql),
- user_ (user),
- passwd_str_ (passwd ? *passwd : ""),
- passwd_ (passwd ? passwd_str_.c_str () : 0),
- db_ (db),
- host_ (host),
- port_ (port),
- socket_str_ (socket ? *socket : ""),
- socket_ (socket ? socket_str_.c_str () : 0),
- charset_ (charset),
- client_flags_ (client_flags),
- factory_ (factory.transfer ())
- {
- if (!factory_)
- factory_.reset (new connection_pool_factory ());
-
- factory_->database (*this);
- }
-
- database::
- database (const string& user,
- const string& passwd,
- const string& db,
- const string& host,
- unsigned int port,
- const string& socket,
- const string& charset,
- unsigned long client_flags,
- transfer_ptr<connection_factory> factory)
- : odb::database (id_mysql),
- user_ (user),
- passwd_str_ (passwd),
- passwd_ (passwd_str_.c_str ()),
- db_ (db),
- host_ (host),
- port_ (port),
- socket_str_ (socket),
- socket_ (socket_str_.c_str ()),
- charset_ (charset),
- client_flags_ (client_flags),
- factory_ (factory.transfer ())
- {
- if (!factory_)
- factory_.reset (new connection_pool_factory ());
-
- factory_->database (*this);
- }
-
- database::
- database (const string& user,
- const string* passwd,
- const string& db,
- const string& host,
- unsigned int port,
- const string& socket,
- const string& charset,
- unsigned long client_flags,
- transfer_ptr<connection_factory> factory)
- : odb::database (id_mysql),
- user_ (user),
- passwd_str_ (passwd ? *passwd : ""),
- passwd_ (passwd ? passwd_str_.c_str () : 0),
- db_ (db),
- host_ (host),
- port_ (port),
- socket_str_ (socket),
- socket_ (socket_str_.c_str ()),
- charset_ (charset),
- client_flags_ (client_flags),
- factory_ (factory.transfer ())
- {
- if (!factory_)
- factory_.reset (new connection_pool_factory ());
-
- factory_->database (*this);
- }
-
- database::
- database (int& argc,
- char* argv[],
- bool erase,
- const string& charset,
- unsigned long client_flags,
- transfer_ptr<connection_factory> factory)
- : odb::database (id_mysql),
- passwd_ (0),
- socket_ (0),
- charset_ (charset),
- client_flags_ (client_flags),
- factory_ (factory.transfer ())
- {
- using namespace details;
-
- try
- {
- cli::argv_file_scanner scan (argc, argv, "--options-file", erase);
- options ops (scan, cli::unknown_mode::skip, cli::unknown_mode::skip);
-
- user_ = ops.user ();
-
- if (ops.password_specified ())
- {
- passwd_str_ = ops.password ();
- passwd_ = passwd_str_.c_str ();
- }
-
- db_ = ops.database ();
- host_ = ops.host ();
- port_ = ops.port ();
-
- if (ops.socket_specified ())
- {
- socket_str_ = ops.socket ();
- socket_ = socket_str_.c_str ();
- }
- }
- catch (const cli::exception& e)
- {
- ostringstream ostr;
- ostr << e;
- throw cli_exception (ostr.str ());
- }
-
- if (!factory_)
- factory_.reset (new connection_pool_factory ());
-
- factory_->database (*this);
- }
-
- void database::
- print_usage (ostream& os)
- {
- details::options::print_usage (os);
- }
-
- transaction_impl* database::
- begin ()
- {
- return new transaction_impl (*this);
- }
-
- odb::connection* database::
- connection_ ()
- {
- connection_ptr c (factory_->connect ());
- return c.release ();
- }
-
- const database::schema_version_info& database::
- load_schema_version (const string& name) const
- {
- schema_version_info& svi (schema_version_map_[name]);
-
- // Construct the SELECT statement text.
- //
- string text ("SELECT `version`, `migration` FROM ");
-
- if (!svi.version_table.empty ())
- text += svi.version_table; // Already quoted.
- else if (!schema_version_table_.empty ())
- text += schema_version_table_; // Already quoted.
- else
- text += "`schema_version`";
-
- text += " WHERE `name` = ?";
-
- // Bind parameters and results.
- //
- unsigned long psize[1] = {static_cast<unsigned long> (name.size ())};
- my_bool pnull[1] = {0};
- MYSQL_BIND pbind[1];
- binding param (pbind, 1);
-
- memset (pbind, 0, sizeof (pbind));
-
- pbind[0].buffer_type = MYSQL_TYPE_STRING;
- pbind[0].buffer = const_cast<char*> (name.c_str ());
- pbind[0].buffer_length = psize[0];
- pbind[0].length = &psize[0];
- pbind[0].is_null = &pnull[0];
-
- param.version++;
-
- signed char migration;
- my_bool rnull[2];
- MYSQL_BIND rbind[2];
- binding result (rbind, 2);
-
- memset (rbind, 0, sizeof (rbind));
-
- rbind[0].buffer_type = MYSQL_TYPE_LONGLONG;
- rbind[0].is_unsigned = 1;
- rbind[0].buffer = &svi.version;
- rbind[0].is_null = &rnull[0];
-
- rbind[1].buffer_type = MYSQL_TYPE_TINY;
- rbind[1].is_unsigned = 0;
- rbind[1].buffer = &migration;
- rbind[1].is_null = &rnull[1];
-
- result.version++;
-
- // If we are not in transaction, MySQL will use an implicit one
- // (i.e., autocommit mode), which suits us just fine.
- //
- connection_ptr cp;
- if (!transaction::has_current ())
- cp = factory_->connect ();
-
- mysql::connection& c (
- cp != 0
- ? *cp
- : transaction::current ().connection (const_cast<database&> (*this)));
-
- try
- {
- select_statement st (c,
- text.c_str (),
- false, // Don't process.
- false, // Don't optimize.
- param,
- result,
- false);
- st.execute ();
- auto_result ar (st);
-
- switch (st.fetch ())
- {
- case select_statement::success:
- {
- svi.migration = migration != 0;
- assert (st.fetch () == select_statement::no_data);
- break;
- }
- case select_statement::no_data:
- {
- svi.version = 0; // No schema.
- break;
- }
- case select_statement::truncated:
- {
- assert (false);
- break;
- }
- }
- }
- catch (const database_exception& e)
- {
- // Detect the case where there is no version table.
- //
- if (e.error () == ER_NO_SUCH_TABLE)
- svi.version = 0; // No schema.
- else
- throw;
- }
-
- return svi;
- }
- }
-}