diff options
Diffstat (limited to 'odb/oracle/database.cxx')
-rw-r--r-- | odb/oracle/database.cxx | 352 |
1 files changed, 0 insertions, 352 deletions
diff --git a/odb/oracle/database.cxx b/odb/oracle/database.cxx deleted file mode 100644 index 3b720be..0000000 --- a/odb/oracle/database.cxx +++ /dev/null @@ -1,352 +0,0 @@ -// file : odb/oracle/database.cxx -// license : ODB NCUEL; see accompanying LICENSE file - -#include <oci.h> - -#include <sstream> - -#include <odb/oracle/traits.hxx> -#include <odb/oracle/database.hxx> -#include <odb/oracle/statement.hxx> -#include <odb/oracle/transaction.hxx> -#include <odb/oracle/exceptions.hxx> -#include <odb/oracle/error.hxx> - -#include <odb/oracle/details/options.hxx> - -using namespace std; - -namespace odb -{ - namespace oracle - { - using odb::details::transfer_ptr; - - database:: - database (const string& user, - const string& password, - const string& db, - ub2 charset, - ub2 ncharset, - OCIEnv* environment, - transfer_ptr<connection_factory> factory) - : odb::database (id_oracle), - user_ (user), - password_ (password), - db_ (db), - port_ (0), - charset_ (charset), - ncharset_ (ncharset), - environment_ (environment), - factory_ (factory.transfer ()) - { - if (environment_ == 0) - { - sword s (OCIEnvNlsCreate (&environment_, - OCI_THREADED, - 0, 0, 0, 0, 0, 0, - charset, - ncharset)); - - if (s == OCI_ERROR) - translate_error (environment_); - - auto_environment_.reset (environment_); - } - - if (!factory_) - factory_.reset (new connection_pool_factory ()); - - factory_->database (*this); - } - - database:: - database (const string& user, - const string& password, - const string& service, - const string& host, - unsigned int port, - ub2 charset, - ub2 ncharset, - OCIEnv* environment, - transfer_ptr<connection_factory> factory) - : odb::database (id_oracle), - user_ (user), - password_ (password), - service_ (service), - host_ (host), - port_ (port), - charset_ (charset), - ncharset_ (ncharset), - environment_ (environment), - factory_ (factory.transfer ()) - { - if (environment_ == 0) - { - sword s (OCIEnvNlsCreate (&environment_, - OCI_THREADED, - 0, 0, 0, 0, 0, 0, - charset, - ncharset)); - - if (s == OCI_ERROR) - translate_error (environment_); - - auto_environment_.reset (environment_); - } - - ostringstream ss; - - if (!host.empty ()) - { - ss << "//" << host_; - - if (port != 0) - ss << ":" << port; - } - - if (!service_.empty ()) - { - if (!host.empty ()) - ss << "/" << service_; - else - ss << service_; - } - - db_ = ss.str (); - - if (!factory_) - factory_.reset (new connection_pool_factory ()); - - factory_->database (*this); - } - - database:: - database (int& argc, - char* argv[], - bool erase, - ub2 charset, - ub2 ncharset, - OCIEnv* environment, - transfer_ptr<connection_factory> factory) - : odb::database (id_oracle), - port_ (0), - charset_ (charset), - ncharset_ (ncharset), - environment_ (environment), - factory_ (factory.transfer ()) - { - if (environment_ == 0) - { - sword s (OCIEnvNlsCreate (&environment_, - OCI_THREADED, - 0, 0, 0, 0, 0, 0, - charset, - ncharset)); - - if (s == OCI_ERROR) - translate_error (environment_); - - auto_environment_.reset (environment_); - } - - 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); - - if (ops.user_specified ()) - user_ = ops.user (); - - if (ops.password_specified ()) - password_ = ops.password (); - - if (ops.database_specified ()) - { - if (ops.host_specified () || - ops.port_specified () || - ops.service_specified ()) - - throw cli_exception ("--host, --port, or --service options " - "cannot be specified together with " - "--database option"); - db_ = ops.database (); - } - else - { - bool host_present (false); - ostringstream oss; - - if (ops.host_specified () && !ops.host ().empty ()) - { - host_present = true; - - host_ = ops.host (); - oss << "//" << host_; - - if (ops.port_specified ()) - { - port_ = ops.port (); - - if (port_ != 0) - oss << ":" << port_; - } - } - - if (ops.service_specified () && !ops.service ().empty ()) - { - service_ = ops.service (); - - if (host_present) - oss << "/" << service_; - else - oss << service_; - } - - db_ = oss.str (); - } - } - catch (const cli::exception& e) - { - ostringstream oss; - oss << e; - throw cli_exception (oss.str ()); - } - - if (!factory_) - factory_.reset (new connection_pool_factory ()); - - factory_->database (*this); - } - - void database:: - print_usage (ostream& os) - { - details::options::print_usage (os); - } - - database:: - ~database () - { - } - - 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\" = :1"; - - // Bind parameters and results. If the schema name is empty, replace - // it with a single space to workaround the VARCHAR2 empty/NULL issue. - // - string n (name.empty () ? string (" ") : name); - ub2 psize[1] = {static_cast<ub2> (n.size ())}; - sb2 pind[1] = {0}; - bind pbind[1] = {{bind::string, - const_cast<char*> (n.c_str ()), - &psize[0], - psize[0], - &pind[0], - 0}}; - binding param (pbind, 1); - param.version++; - - char version[12]; - unsigned int migration; - ub2 rsize[1]; - sb2 rind[2]; - bind rbind[2] = { - {bind::number, - version, - &rsize[0], - static_cast<ub4> (sizeof (version)), - &rind[0], - 0}, - - {bind::uinteger, &migration, 0, 4, &rind[1], 0} - }; - binding result (rbind, 2); - result.version++; - - // If we are not in transaction, then OCI will start an implicit one - // but only if we try to modify anything. Since our statement is read- - // only, we can run without a transaction. - // - connection_ptr cp; - if (!transaction::has_current ()) - cp = factory_->connect (); - - oracle::connection& c ( - cp != 0 - ? *cp - : transaction::current ().connection (const_cast<database&> (*this))); - - try - { - select_statement st (c, - text, - false, // Don't process. - false, // Don't optimize. - param, - result); - st.execute (); - auto_result ar (st); - - switch (st.fetch ()) - { - case select_statement::success: - { - value_traits<unsigned long long, id_big_int>::set_value ( - svi.version, version, rsize[0], rind[0] == -1); - svi.migration = migration != 0; - assert (st.fetch () == select_statement::no_data); - break; - } - case select_statement::no_data: - { - svi.version = 0; // No schema. - break; - } - } - } - catch (const database_exception& e) - { - // Detect the case where there is no version table. - // - if (e.size () != 0 && e.begin ()->error () == 942) - svi.version = 0; // No schema. - else - throw; - } - - return svi; - } - } -} |