From 8ded1d9f1084bd16078e840817cbbbf4df5c18f2 Mon Sep 17 00:00:00 2001 From: Alexey Kopytov Date: Sat, 21 Apr 2018 08:08:48 +0300 Subject: [PATCH] Remove unsupported Oracle, Drizzle and AttachSQL drivers from the source tree. --- Makefile.am | 2 +- README-Oracle.md | 56 -- README.md | 3 - configure.ac | 77 -- src/Makefile.am | 20 +- src/db_driver.c | 12 - src/db_driver.h | 16 - src/drivers/Makefile.am | 14 +- src/drivers/attachsql/Makefile.am | 21 - src/drivers/attachsql/drv_attachsql.c | 622 -------------- src/drivers/drizzle/Makefile.am | 19 - src/drivers/drizzle/drv_drizzle.c | 706 ---------------- src/drivers/oracle/Makefile.am | 21 - src/drivers/oracle/drv_oracle.c | 1114 ------------------------- src/lua/oltp_common.lua | 3 +- 15 files changed, 7 insertions(+), 2699 deletions(-) delete mode 100644 README-Oracle.md delete mode 100644 src/drivers/attachsql/Makefile.am delete mode 100644 src/drivers/attachsql/drv_attachsql.c delete mode 100644 src/drivers/drizzle/Makefile.am delete mode 100644 src/drivers/drizzle/drv_drizzle.c delete mode 100644 src/drivers/oracle/Makefile.am delete mode 100644 src/drivers/oracle/drv_oracle.c diff --git a/Makefile.am b/Makefile.am index 379d582..3c21ad1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -28,7 +28,7 @@ endif SUBDIRS = $(LUAJIT_DIR) $(CK_DIR) src tests -EXTRA_DIST = autogen.sh README.md README-WIN.txt README-Oracle.md ChangeLog \ +EXTRA_DIST = autogen.sh README.md README-WIN.txt ChangeLog \ snap/snapcraft.yaml.in third_party/cram \ debian/changelog debian/compat debian/control debian/copyright \ debian/dirs debian/docs debian/install debian/rules \ diff --git a/README-Oracle.md b/README-Oracle.md deleted file mode 100644 index 8660022..0000000 --- a/README-Oracle.md +++ /dev/null @@ -1,56 +0,0 @@ -**WARNING: Oracle support is unmaintained as of sysbench 1.0. You may -want to -try [sysbench 0.5](https://github.com/akopytov/sysbench/tree/0.5) -instead. The corresponding code and instructions below are still in the -source tree in case somebody wants to update them. Patches are always -welcome! ** - --------------------------------------------------------------- -Oracle Build steps --------------------------------------------------------------- - -Using Ubuntu 14.04 - intructions dated for 21/09/2016 (Was built on AWS -in an r3.xlarge These actions were done against 0.5 checkout) - -* Setup Oracle Instant Client - -https://help.ubuntu.com/community/Oracle%20Instant%20Client download -from -http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html. - -The following RPM's and upload them to the server: -- oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm -- oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm - -``` -alien -i oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm -alien -i oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm -``` - -* Install Cuda - http://www.r-tutor.com/gpu-computing/cuda-installation/cuda7.5-ubuntu - -``` -wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/cuda-repo-ubuntu1404_7.5-18_amd64.deb -sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb -sudo apt-get update -sudo apt-get install cuda -export CUDA_HOME=/usr/local/cuda-7.5 -export LD_LIBRARY_PATH=${CUDA_HOME}/lib64 - -PATH=${CUDA_HOME}/bin:${PATH} -export PATH -echo "/usr/lib/oracle/12.1/client64/lib" > /etc/ld.so.conf.d/oracle-client-12.1.conf -ldconfig -``` - -* Build sysbench -Use the following `configure` option to build with Oracle support: -``` -./configure --with-oracle="/usr/lib/oracle/12.1/client64" -``` - -Run the following commands to allow sysbench use the full number of cores: -``` -sudo sh -c 'for x in /sys/class/net/eth0/queues/rx-*; do echo ffffffff> $x/rps_cpus; done' -sudo sh -c "echo 32768 > /proc/sys/net/core/rps_sock_flow_entries" -sudo sh -c "echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt" -``` diff --git a/README.md b/README.md index 1b15af3..9b9e0f8 100644 --- a/README.md +++ b/README.md @@ -190,9 +190,6 @@ To compile sysbench without MySQL support, use `--without-mysql`. If no database drivers are available database-related scripts will not work, but other benchmarks will be functional. -See [README-Oracle.md](README-Oracle.md) for instructions on building -with Oracle client libraries. - # Usage ## General Syntax diff --git a/configure.ac b/configure.ac index 86c4280..49de13a 100644 --- a/configure.ac +++ b/configure.ac @@ -127,40 +127,6 @@ AS_IF([test "x$with_mysql" != "xno"], [mysql_support=no]) AC_MSG_RESULT([$mysql_support]) -# Check if we should compile with Drizzle support -AC_ARG_WITH([drizzle], - AS_HELP_STRING([--with-drizzle], - [compile with Drizzle support (default is disabled)]), - [], [with_drizzle=no]) -AC_MSG_CHECKING([whether to compile with Drizzle support]) -AS_IF([test "x$with_drizzle" != "xno"], - [drizzle_support=yes], - [drizzle_support=no]) -AC_MSG_RESULT([$drizzle_support]) - -# Check if we should compile with libattachsql support -AC_ARG_WITH([attachsql], - AS_HELP_STRING([--with-attachsql], - [compile with libattachsql support (default is disabled)]), - [], [with_attachsql=no]) -AC_MSG_CHECKING([whether to compile with libattachsql support]) -AS_IF([test "x$with_attachsql" != "xno"], - [attachsql_support=yes], - [attachsql_support=no]) -AC_MSG_RESULT([$attachsql_support]) - - -# Check if we should compile with Oracle support -AC_ARG_WITH([oracle], - AS_HELP_STRING([--with-oracle], - [compile with Oracle support (default is disabled)]), - [], [with_oracle=no]) -AC_MSG_CHECKING([whether to compile with Oracle support]) -AS_IF([test "x$with_oracle" != "xno"], - [oracle_support=yes], - [oracle_support=no]) -AC_MSG_RESULT([$oracle_support]) - # Check if we should compile with PostgreSQL support AC_ARG_WITH([pgsql], AS_HELP_STRING([--with-pgsql], @@ -219,43 +185,6 @@ AC_CHECK_LIB(m, sqrt) SB_CHECK_MYSQL -AS_IF([test "x$with_drizzle" != xno], [ - AC_LIB_HAVE_LINKFLAGS(drizzle,, - [#include ], - [ - int x= DRIZZLE_RETURN_ERROR_CODE; - const char *version= drizzle_version(); - ]) - AS_IF([test "x$ac_cv_libdrizzle" = xyes], [ - AC_DEFINE([USE_DRIZZLE],1, - [Define to 1 if you want to compile with Drizzle support]) - ]) -]) -AM_CONDITIONAL(USE_DRIZZLE, test x$ac_cv_libdrizzle = xyes) - -AS_IF([test "x$with_attachsql" != xno], [ - AC_LIB_HAVE_LINKFLAGS(attachsql,, - [#include ], - [ - const char *version= attachsql_get_library_version(); - ]) - AS_IF([test "x$ac_cv_libattachsql" = xyes], [ - AC_DEFINE(USE_ATTACHSQL,1, - [Define to 1 if you want to compile with libattachsql support]) - ]) -]) -AM_CONDITIONAL(USE_ATTACHSQL, test x$ac_cv_libattachsql = xyes) - - -AS_IF([test x$with_oracle != xno], [ - AC_DEFINE(USE_ORACLE,1,[Define to 1 if you want to compile with Oracle support]) - ORA_LIBS="-L${sb_with_oracle}/lib -lclntsh" - ORA_CFLAGS="-I${with_oracle}/include -I${with_oracle}/rdbms/demo -I${with_oracle}/rdbms/public" - AC_SUBST([ORA_LIBS]) - AC_SUBST([ORA_CFLAGS]) -]) -AM_CONDITIONAL(USE_ORACLE, test x$with_oracle != xno) - AS_IF([test x$with_pgsql != xno], [ AC_CHECK_PGSQL([$with_pgsql]) USE_PGSQL=1 @@ -468,10 +397,7 @@ third_party/concurrency_kit/Makefile src/Makefile src/drivers/Makefile src/drivers/mysql/Makefile -src/drivers/drizzle/Makefile -src/drivers/oracle/Makefile src/drivers/pgsql/Makefile -src/drivers/attachsql/Makefile src/tests/Makefile src/tests/cpu/Makefile src/tests/fileio/Makefile @@ -501,9 +427,6 @@ AC_MSG_RESULT([mandir : $(eval echo ${mandir})]) AC_MSG_RESULT([datadir : $(eval echo ${datadir})]) AC_MSG_RESULT([]) AC_MSG_RESULT([MySQL support : ${mysql_support}]) -AC_MSG_RESULT([Drizzle support : ${drizzle_support}]) -AC_MSG_RESULT([AttachSQL support : ${attachsql_support}]) -AC_MSG_RESULT([Oracle support : ${oracle_support}]) AC_MSG_RESULT([PostgreSQL support : ${pgsql_support}]) AC_MSG_RESULT([]) AC_MSG_RESULT([LuaJIT : ${sb_use_luajit}]) diff --git a/src/Makefile.am b/src/Makefile.am index 2d8cf98..fff13ea 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -26,18 +26,6 @@ if USE_MYSQL mysql_ldadd = drivers/mysql/libsbmysql.a $(MYSQL_LIBS) endif -if USE_DRIZZLE -drizzle_ldadd = drivers/drizzle/libsbdrizzle.a $(LIBDRIZZLE) -endif - -if USE_ATTACHSQL -attachsql_ldadd = drivers/attachsql/libsbattachsql.a $(LIBATTACHSQL) -endif - -if USE_ORACLE -ora_ldadd = drivers/oracle/libsboracle.a $(ORA_LIBS) -endif - if USE_PGSQL pgsql_ldadd = drivers/pgsql/libsbpgsql.a $(PGSQL_LIBS) endif @@ -56,8 +44,8 @@ xoroshiro128plus.h sysbench_LDADD = tests/fileio/libsbfileio.a tests/threads/libsbthreads.a \ tests/memory/libsbmemory.a tests/cpu/libsbcpu.a \ tests/mutex/libsbmutex.a \ - $(mysql_ldadd) $(drizzle_ldadd) $(attachsql_ldadd) $(pgsql_ldadd) \ - $(ora_ldadd) $(LUAJIT_LIBS) $(CK_LIBS) + $(mysql_ldadd) $(pgsql_ldadd) \ + $(LUAJIT_LIBS) $(CK_LIBS) -sysbench_LDFLAGS = $(mysql_ldflags) $(attachsql_ldflags) \ - $(pgsql_ldflags) $(ora_ldflags) $(LUAJIT_LDFLAGS) +sysbench_LDFLAGS = $(mysql_ldflags) \ + $(pgsql_ldflags) $(LUAJIT_LDFLAGS) diff --git a/src/db_driver.c b/src/db_driver.c index 3fb843c..0a3b25d 100644 --- a/src/db_driver.c +++ b/src/db_driver.c @@ -103,18 +103,6 @@ int db_register(void) #ifdef USE_MYSQL register_driver_mysql(&drivers); #endif -#ifdef USE_DRIZZLE - register_driver_drizzle(&drivers); -#endif -#ifdef USE_ATTACHSQL - register_driver_attachsql(&drivers); -#endif -#ifdef USE_DRIZZLECLIENT - register_driver_drizzleclient(&drivers); -#endif -#ifdef USE_ORACLE - register_driver_oracle(&drivers); -#endif #ifdef USE_PGSQL register_driver_pgsql(&drivers); #endif diff --git a/src/db_driver.h b/src/db_driver.h index 74e9f03..622ba41 100644 --- a/src/db_driver.h +++ b/src/db_driver.h @@ -323,22 +323,6 @@ void db_report_cumulative(sb_stat_t *); int register_driver_mysql(sb_list_t *); #endif -#ifdef USE_DRIZZLE -int register_driver_drizzle(sb_list_t *); -#endif - -#ifdef USE_ATTACHSQL -int register_driver_attachsql(sb_list_t *); -#endif - -#ifdef USE_DRIZZLECLIENT -int register_driver_drizzleclient(sb_list_t *); -#endif - -#ifdef USE_ORACLE -int register_driver_oracle(sb_list_t *); -#endif - #ifdef USE_PGSQL int register_driver_pgsql(sb_list_t *); #endif diff --git a/src/drivers/Makefile.am b/src/drivers/Makefile.am index 708b663..938d7eb 100644 --- a/src/drivers/Makefile.am +++ b/src/drivers/Makefile.am @@ -19,20 +19,8 @@ if USE_MYSQL MYSQL_DIR = mysql endif -if USE_DRIZZLE -DRIZZLE_DIR = drizzle -endif - -if USE_ATTACHSQL -ATTACHSQL_DIR = attachsql -endif - -if USE_ORACLE -ORACLE_DIR = oracle -endif - if USE_PGSQL PGSQL_DIR = pgsql endif -SUBDIRS = $(MYSQL_DIR) $(ORACLE_DIR) $(PGSQL_DIR) $(DRIZZLE_DIR) $(ATTACHSQL_DIR) +SUBDIRS = $(MYSQL_DIR) $(PGSQL_DIR) diff --git a/src/drivers/attachsql/Makefile.am b/src/drivers/attachsql/Makefile.am deleted file mode 100644 index 1714b5f..0000000 --- a/src/drivers/attachsql/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright 2014 Hewlett-Packard Development Company, L.P. -# based on the Drizzle driver: -# Copyright (C) 2009 Sun Microsystems, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -noinst_LIBRARIES = libsbattachsql.a - -libsbattachsql_a_SOURCES = drv_attachsql.c diff --git a/src/drivers/attachsql/drv_attachsql.c b/src/drivers/attachsql/drv_attachsql.c deleted file mode 100644 index dadbd09..0000000 --- a/src/drivers/attachsql/drv_attachsql.c +++ /dev/null @@ -1,622 +0,0 @@ -/* Copyright 2014 Hewlett-Packard Development Company, L.P. - based on the Drizzle driver: - Copyright (C) 2009 Sun Microsystems, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#ifdef HAVE_STRING_H -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#include - -#include -#include - -#include "sb_options.h" - -#include "db_driver.h" - -#define DEBUG(format, ...) do { if (db_globals.debug) log_text(LOG_DEBUG, format, __VA_ARGS__); } while (0) - -/* Drizzle driver arguments */ - -static sb_arg_t attachsql_drv_args[] = -{ - {"attachsql-host", "libAttachSQL server host", SB_ARG_TYPE_LIST, "localhost"}, - {"attachsql-port", "libAttachSQL server port", SB_ARG_TYPE_INT, "4427"}, - {"attachsql-socket", "libAttachSQL socket", SB_ARG_TYPE_STRING, NULL}, - {"attachsql-user", "libAttachSQL user", SB_ARG_TYPE_STRING, ""}, - {"attachsql-password", "libAttachSQL password", SB_ARG_TYPE_STRING, ""}, - {"attachsql-db", "libAttachSQL database name", SB_ARG_TYPE_STRING, "sbtest"}, - {NULL, NULL, SB_ARG_TYPE_NULL, NULL} -}; - -typedef struct -{ - sb_list_t *hosts; - unsigned int port; - char *socket; - char *user; - char *password; - char *db; -} attachsql_drv_args_t; - -/* AttachSQL driver capabilities - * At a later date we will add prepared statements to this - */ - -static drv_caps_t attachsql_drv_caps = -{ - .multi_rows_insert = 1, - .prepared_statements = 1, - .auto_increment = 1, - .serial = 0, - .unsigned_int = 0, -}; - -static attachsql_drv_args_t args; /* driver args */ - -static sb_list_item_t *hosts_pos; - -static pthread_mutex_t hosts_mutex; - -/* libAttachSQL driver operations */ - -static int attachsql_drv_init(void); -static int attachsql_drv_describe(drv_caps_t *); -static int attachsql_drv_connect(db_conn_t *); -static int attachsql_drv_disconnect(db_conn_t *); -static int attachsql_drv_prepare(db_stmt_t *, const char *, size_t); -static int attachsql_drv_bind_param(db_stmt_t *, db_bind_t *, size_t); -static int attachsql_drv_bind_result(db_stmt_t *, db_bind_t *, size_t); -static db_error_t attachsql_drv_execute(db_stmt_t *, db_result_t *); -static int attachsql_drv_fetch(db_result_t *); -static int attachsql_drv_fetch_row(db_result_t *, db_row_t *); -static db_error_t attachsql_drv_query(db_conn_t *, const char *, size_t, - db_result_t *); -static int attachsql_drv_free_results(db_result_t *); -static int attachsql_drv_close(db_stmt_t *); -static int attachsql_drv_store_results(db_result_t *); -static int attachsql_drv_done(void); - -/* libAttachSQL driver definition */ - -static db_driver_t attachsql_driver = -{ - .sname = "attachsql", - .lname = "libAttachSQL driver", - .args = attachsql_drv_args, - .ops = - { - .init = attachsql_drv_init, - .describe = attachsql_drv_describe, - .connect = attachsql_drv_connect, - .disconnect = attachsql_drv_disconnect, - .prepare = attachsql_drv_prepare, - .bind_param = attachsql_drv_bind_param, - .bind_result = attachsql_drv_bind_result, - .execute = attachsql_drv_execute, - .fetch = attachsql_drv_fetch, - .fetch_row = attachsql_drv_fetch_row, - .free_results = attachsql_drv_free_results, - .close = attachsql_drv_close, - .query = attachsql_drv_query, - .store_results = attachsql_drv_store_results, - .done = attachsql_drv_done - } -}; - - -/* Local functions */ - -/* Register libAttachSQL driver */ - - -int register_driver_attachsql(sb_list_t *drivers) -{ - SB_LIST_ADD_TAIL(&attachsql_driver.listitem, drivers); - - return 0; -} - - -/* libAttachSQL driver initialization */ - - -int attachsql_drv_init(void) -{ - args.hosts = sb_get_value_list("attachsql-host"); - if (SB_LIST_IS_EMPTY(args.hosts)) - { - log_text(LOG_FATAL, "No libAttachSQL hosts specified, aborting"); - return 1; - } - hosts_pos = args.hosts; - pthread_mutex_init(&hosts_mutex, NULL); - - args.port = (unsigned int)sb_get_value_int("attachsql-port"); - args.socket = sb_get_value_string("attachsql-socket"); - args.user = sb_get_value_string("attachsql-user"); - args.password = sb_get_value_string("attachsql-password"); - args.db = sb_get_value_string("attachsql-db"); - attachsql_library_init(); - return 0; -} - - -/* Describe database capabilities (possibly depending on table type) */ - - -int attachsql_drv_describe(drv_caps_t *caps ) -{ - *caps = attachsql_drv_caps; - - return 0; -} - - -/* Connect to libAttachSQL database */ - - -int attachsql_drv_connect(db_conn_t *sb_conn) -{ - attachsql_connect_t *con= NULL; - const char *host; - attachsql_error_t *error= NULL; - attachsql_return_t aret= ATTACHSQL_RETURN_NONE; - - if (args.socket) - { - DEBUG("attachsql_connect_create(\"%s\", \"%s\", \"%s\", \"%s\")", - args.socket, - args.user, - args.password, - args.db); - con= attachsql_connect_create(args.socket, - 0, - args.user, - args.password, - args.db, - &error); - } else { - - pthread_mutex_lock(&hosts_mutex); - hosts_pos = SB_LIST_ITEM_NEXT(hosts_pos); - if (hosts_pos == args.hosts) - hosts_pos = SB_LIST_ITEM_NEXT(hosts_pos); - host = SB_LIST_ENTRY(hosts_pos, value_t, listitem)->data; - pthread_mutex_unlock(&hosts_mutex); - - DEBUG("attachsql_connect_create(\"%s\", %u, \"%s\", \"%s\", \"%s\")", - host, - args.port, - args.user, - args.password, - args.db); - con= attachsql_connect_create(host, - args.port, - args.user, - args.password, - args.db, - &error); - } - if (con == NULL) - { - log_text(LOG_FATAL, "unable to Add libAttachSQL Connection, aborting..."); - log_text(LOG_FATAL, "error %d: %s", attachsql_error_code(error), attachsql_error_message(error)); - attachsql_error_free(error); - return 1; - } - attachsql_connect_set_option(con, ATTACHSQL_OPTION_SEMI_BLOCKING, NULL); - - if (!attachsql_connect(con, &error)) - { - log_text(LOG_FATAL, "unable to connect to libAttachSQL server"); - log_text(LOG_FATAL, "error %d: %s", attachsql_error_code(error), attachsql_error_message(error)); - attachsql_error_free(error); - attachsql_connect_destroy(con); - return 1; - - } - - while (aret != ATTACHSQL_RETURN_IDLE) - { - aret = attachsql_connect_poll(con, &error); - - if (error) - { - log_text(LOG_FATAL, "unable to connect to libAttachSQL server"); - log_text(LOG_FATAL, "error %d: %s", attachsql_error_code(error), attachsql_error_message(error)); - attachsql_error_free(error); - attachsql_connect_destroy(con); - return 1; - } - } - - sb_conn->ptr = con; - - return 0; -} - - -/* Disconnect from libAttachSQL database */ - - -int attachsql_drv_disconnect(db_conn_t *sb_conn) -{ - attachsql_connect_t *con = (attachsql_connect_t *)sb_conn->ptr; - - if (con != NULL) - { - DEBUG("attachsql_connect_destroy(%p)", con); - attachsql_connect_destroy(con); - } - return 0; -} - - -/* Prepare statement */ - - -int attachsql_drv_prepare(db_stmt_t *stmt, const char *query, size_t len) -{ - attachsql_connect_t *con= (attachsql_connect_t *)stmt->connection->ptr; - attachsql_error_t *error= NULL; - attachsql_return_t aret= ATTACHSQL_RETURN_NONE; - attachsql_statement_prepare(con, len, query, &error); - while(aret != ATTACHSQL_RETURN_EOF) - { - aret= attachsql_connect_poll(con, &error); - if (error) - { - log_text(LOG_ALERT, "libAttachSQL Prepare Failed: %u:%s", attachsql_error_code(error), attachsql_error_message(error)); - attachsql_error_free(error); - return DB_ERROR_FATAL; - } - } - - return 0; -} - - -/* Bind parameters for prepared statement */ -int attachsql_drv_bind_param(db_stmt_t *stmt, db_bind_t *params, size_t len) -{ - /* libAttachSQL doesn't do this, you do this during execute - * this is because sysbench doesn't set the values until that time - */ - - if (stmt->bound_param != NULL) - free(stmt->bound_param); - stmt->bound_param = (db_bind_t *)malloc(len * sizeof(db_bind_t)); - if (stmt->bound_param == NULL) - return 1; - memcpy(stmt->bound_param, params, len * sizeof(db_bind_t)); - stmt->bound_param_len = len; - - return 0; - -} - - -/* Bind results for prepared statement */ -int attachsql_drv_bind_result(db_stmt_t *stmt, db_bind_t *params, size_t len) -{ - (void)stmt; - (void)params; - (void)len; - /* libAttachSQL doesn't do this, you get after execute */ - return 0; -} - - -/* Execute prepared statement */ - - -db_error_t attachsql_drv_execute(db_stmt_t *stmt, db_result_t *rs) -{ - (void) rs; - attachsql_connect_t *con= (attachsql_connect_t *)stmt->connection->ptr; - attachsql_return_t aret= ATTACHSQL_RETURN_NONE; - attachsql_error_t *error= NULL; - - uint16_t i; - int8_t tinyint; - int16_t smallint; - int32_t normalint; - int64_t bigint; - float float_type; - double double_type; - db_time_t *time_data; - if (con == NULL) - return 1; - - for (i= 0; i < stmt->bound_param_len; i++) - { - db_bind_t *param= &stmt->bound_param[i]; - switch(param->type) - { - case DB_TYPE_TINYINT: - tinyint= *(int8_t*)param->buffer; - attachsql_statement_set_int(con, i, tinyint, NULL); - break; - case DB_TYPE_SMALLINT: - smallint= *(int16_t*)param->buffer; - attachsql_statement_set_int(con, i, smallint, NULL); - break; - case DB_TYPE_INT: - normalint= *(int32_t*)param->buffer; - attachsql_statement_set_int(con, i, normalint, NULL); - break; - case DB_TYPE_BIGINT: - bigint= *(int64_t*)param->buffer; - attachsql_statement_set_bigint(con, i, bigint, NULL); - break; - case DB_TYPE_FLOAT: - float_type= *(float*)param->buffer; - attachsql_statement_set_float(con, i, float_type, NULL); - break; - case DB_TYPE_DOUBLE: - double_type= *(double*)param->buffer; - attachsql_statement_set_double(con, i, double_type, NULL); - break; - case DB_TYPE_TIME: - time_data= (db_time_t*)param->buffer; - attachsql_statement_set_time(con, i, time_data->hour, time_data->minute, time_data->second, 0, false, NULL); - break; - case DB_TYPE_DATE: - case DB_TYPE_DATETIME: - case DB_TYPE_TIMESTAMP: - time_data= (db_time_t*)param->buffer; - attachsql_statement_set_datetime(con, i, time_data->year, time_data->month, time_data->day, time_data->hour, time_data->minute, time_data->second, 0, NULL); - break; - case DB_TYPE_CHAR: - case DB_TYPE_VARCHAR: - attachsql_statement_set_string(con, i, param->max_len, param->buffer, NULL); - case DB_TYPE_NONE: - default: - attachsql_statement_set_null(con, i, NULL); - /* Not supported */ - } - } - - attachsql_statement_execute(con, &error); - - while(aret != ATTACHSQL_RETURN_EOF) - { - aret= attachsql_connect_poll(con, &error); - if (aret == ATTACHSQL_RETURN_ROW_READY) - { - return 0; - } - if (error) - { - log_text(LOG_ALERT, "libAttachSQL Execute Failed: %u:%s", attachsql_error_code(error), attachsql_error_message(error)); - attachsql_error_free(error); - return DB_ERROR_FATAL; - } - } - - return DB_ERROR_NONE; -} - - -/* Execute SQL query */ - - -db_error_t attachsql_drv_query(db_conn_t *sb_conn, const char *query, - size_t len, db_result_t *rs) -{ - (void) rs; - attachsql_connect_t *con = sb_conn->ptr; - unsigned int rc; - attachsql_error_t *error= NULL; - attachsql_return_t aret= ATTACHSQL_RETURN_NONE; - - /* Close any previous query */ - attachsql_query_close(con); - - DEBUG("attachsql_query(%p, \"%s\", %u)", - con, - query, - len); - attachsql_query(con, len, query, 0, NULL, &error); - - while((aret != ATTACHSQL_RETURN_EOF) && (aret != ATTACHSQL_RETURN_ROW_READY)) - { - aret= attachsql_connect_poll(con, &error); - - if (error) - { - rc= attachsql_error_code(error); - if (rc == 1213 || rc == 1205 || rc == 1020) - { - attachsql_error_free(error); - return DB_ERROR_IGNORABLE; - } - log_text(LOG_ALERT, "libAttachSQL Query Failed: %u:%s", attachsql_error_code(error), attachsql_error_message(error)); - attachsql_error_free(error); - return DB_ERROR_FATAL; - } - } - //rs->connection->ptr= con; - DEBUG("attachsql_query \"%s\" returned %d", query, aret); - - return DB_ERROR_NONE; -} - - -/* Fetch row from result set of a prepared statement */ - - -int attachsql_drv_fetch(db_result_t *rs) -{ - /* NYI */ - attachsql_connect_t *con = rs->connection->ptr; - size_t tmp_len; - uint16_t columns, col; - attachsql_return_t aret= ATTACHSQL_RETURN_NONE; - attachsql_error_t *error= NULL; - - while((aret != ATTACHSQL_RETURN_EOF) && (aret != ATTACHSQL_RETURN_ROW_READY)) - { - aret= attachsql_connect_poll(con, &error); - - if (error) - { - log_text(LOG_ALERT, "libAttachSQL Query Failed: %u:%s", attachsql_error_code(error), attachsql_error_message(error)); - attachsql_error_free(error); - return 1; - } - } - if (aret == ATTACHSQL_RETURN_EOF) - { - return 1; - } - attachsql_statement_row_get(con, NULL); - columns= attachsql_query_column_count(con); - for (col= 0; col < columns; col++) - { - switch (attachsql_statement_get_column_type(con, col)) - { - case ATTACHSQL_COLUMN_TYPE_TINY: - case ATTACHSQL_COLUMN_TYPE_SHORT: - case ATTACHSQL_COLUMN_TYPE_LONG: - case ATTACHSQL_COLUMN_TYPE_YEAR: - case ATTACHSQL_COLUMN_TYPE_INT24: - attachsql_statement_get_int(con, col, &error); - break; - case ATTACHSQL_COLUMN_TYPE_LONGLONG: - attachsql_statement_get_bigint(con, col, &error); - break; - case ATTACHSQL_COLUMN_TYPE_FLOAT: - attachsql_statement_get_float(con, col, &error); - break; - case ATTACHSQL_COLUMN_TYPE_DOUBLE: - attachsql_statement_get_double(con, col, &error); - break; - default: - attachsql_statement_get_char(con, col, &tmp_len, &error); - break; - } - } - attachsql_query_row_next(con); - - return 0; -} - - -/* Fetch row from result set of a query */ - - -int attachsql_drv_fetch_row(db_result_t *rs, db_row_t *row) -{ - attachsql_error_t *error= NULL; - attachsql_return_t aret= ATTACHSQL_RETURN_NONE; - - /* NYI */ - - attachsql_connect_t *con = rs->connection->ptr; - - while((aret != ATTACHSQL_RETURN_EOF) && (aret != ATTACHSQL_RETURN_ROW_READY)) - { - aret= attachsql_connect_poll(con, &error); - - if (error) - { - log_text(LOG_ALERT, "libAttachSQL Query Failed: %u:%s", attachsql_error_code(error), attachsql_error_message(error)); - attachsql_error_free(error); - return 1; - } - } - if (aret == ATTACHSQL_RETURN_EOF) - { - return 1; - } - row->ptr= attachsql_query_row_get(con, NULL); - attachsql_query_row_next(con); - - return 0; -} - - -/* Store results from the last query */ - - -int attachsql_drv_store_results(db_result_t *rs) -{ - int ret= 0; - db_row_t row; - /* libAttachSQL can't do things in this order */ - while (ret == 0) - { - if (rs->statement != NULL) - { - ret= attachsql_drv_fetch(rs); - } - else - { - ret= attachsql_drv_fetch_row(rs, &row); - } - } - - return DB_ERROR_NONE; -} - - -/* Free result set */ - - -int attachsql_drv_free_results(db_result_t *rs) -{ - - if (rs->connection->ptr != NULL) - { - DEBUG("attachsql_query_close(%p)", rs->connection->ptr); - attachsql_query_close(rs->connection->ptr); - rs->connection->ptr = NULL; - return 0; - } - - return 1; -} - - -/* Close prepared statement */ - - -int attachsql_drv_close(db_stmt_t *stmt) -{ - attachsql_connect_t *con= (attachsql_connect_t *)stmt->connection->ptr; - attachsql_statement_close(con); - - return 0; -} - - -/* Uninitialize driver */ -int attachsql_drv_done(void) -{ - return 0; -} - diff --git a/src/drivers/drizzle/Makefile.am b/src/drivers/drizzle/Makefile.am deleted file mode 100644 index 0653ad7..0000000 --- a/src/drivers/drizzle/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (C) 2009 Sun Microsystems, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -noinst_LIBRARIES = libsbdrizzle.a - -libsbdrizzle_a_SOURCES = drv_drizzle.c diff --git a/src/drivers/drizzle/drv_drizzle.c b/src/drivers/drizzle/drv_drizzle.c deleted file mode 100644 index da8f69b..0000000 --- a/src/drivers/drizzle/drv_drizzle.c +++ /dev/null @@ -1,706 +0,0 @@ -/* Copyright (C) 2009 Sun Microsystems, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#ifdef HAVE_STRING_H -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#include - -#include - -#include "sb_options.h" - -#include "db_driver.h" - -#define DEBUG(format, ...) do { if (db_globals.debug) log_text(LOG_DEBUG, format, __VA_ARGS__); } while (0) - -/* Drizzle driver arguments */ - -static sb_arg_t drizzle_drv_args[] = -{ - {"drizzle-host", "Drizzle server host", SB_ARG_TYPE_LIST, "localhost"}, - {"drizzle-port", "Drizzle server port", SB_ARG_TYPE_INT, "4427"}, - {"drizzle-socket", "Drizzle socket", SB_ARG_TYPE_STRING, NULL}, - {"drizzle-user", "Drizzle user", SB_ARG_TYPE_STRING, ""}, - {"drizzle-password", "Drizzle password", SB_ARG_TYPE_STRING, ""}, - {"drizzle-db", "Drizzle database name", SB_ARG_TYPE_STRING, "sbtest"}, - {"drizzle-buffer", "Level of library buffering (none, field, row, all)", SB_ARG_TYPE_STRING, "none"}, - {"drizzle-mysql", "Use MySQL Protocol", SB_ARG_TYPE_BOOL, "off"}, - - {NULL, NULL, SB_ARG_TYPE_NULL, NULL} -}; - -typedef enum -{ - BUFFER_NONE, - BUFFER_FIELD, - BUFFER_ROW, - BUFFER_ALL -} buffer_level; - -typedef struct -{ - sb_list_t *hosts; - unsigned int port; - char *socket; - char *user; - char *password; - char *db; - buffer_level buffer; - int mysql; -} drizzle_drv_args_t; - -/* Drizzle driver capabilities */ - -static drv_caps_t drizzle_drv_caps = -{ - .multi_rows_insert = 1, - .prepared_statements = 0, - .auto_increment = 1, - .serial = 0, - .unsigned_int = 0, -}; - -static drizzle_drv_args_t args; /* driver args */ - -static sb_list_item_t *hosts_pos; - -static pthread_mutex_t hosts_mutex; - -static void column_info(drizzle_column_st *column); - -/* Drizzle driver operations */ - -static int drizzle_drv_init(void); -static int drizzle_drv_describe(drv_caps_t *); -static int drizzle_drv_connect(db_conn_t *); -static int drizzle_drv_disconnect(db_conn_t *); -static int drizzle_drv_prepare(db_stmt_t *, const char *, size_t); -static int drizzle_drv_bind_param(db_stmt_t *, db_bind_t *, size_t); -static int drizzle_drv_bind_result(db_stmt_t *, db_bind_t *, size_t); -static db_error_t drizzle_drv_execute(db_stmt_t *, db_result_t *); -static int drizzle_drv_fetch(db_result_t *); -static int drizzle_drv_fetch_row(db_result_t *, db_row_t *); -static db_error_t drizzle_drv_query(db_conn_t *, const char *, size_t, - db_result_t *); -static int drizzle_drv_free_results(db_result_t *); -static int drizzle_drv_close(db_stmt_t *); -static int drizzle_drv_store_results(db_result_t *); -static int drizzle_drv_done(void); - -/* Drizzle driver definition */ - -static db_driver_t drizzle_driver = -{ - .sname = "drizzle", - .lname = "Drizzle driver", - .args = drizzle_drv_args, - .ops = - { - .init = drizzle_drv_init, - .describe = drizzle_drv_describe, - .connect = drizzle_drv_connect, - .disconnect = drizzle_drv_disconnect, - .prepare = drizzle_drv_prepare, - .bind_param = drizzle_drv_bind_param, - .bind_result = drizzle_drv_bind_result, - .execute = drizzle_drv_execute, - .fetch = drizzle_drv_fetch, - .fetch_row = drizzle_drv_fetch_row, - .free_results = drizzle_drv_free_results, - .close = drizzle_drv_close, - .query = drizzle_drv_query, - .store_results = drizzle_drv_store_results, - .done = drizzle_drv_done - }, -}; - - -/* Local functions */ - -/* Register Drizzle driver */ - - -int register_driver_drizzle(sb_list_t *drivers) -{ - SB_LIST_ADD_TAIL(&drizzle_driver.listitem, drivers); - - return 0; -} - - -/* Drizzle driver initialization */ - - -int drizzle_drv_init(void) -{ - char *s; - - args.hosts = sb_get_value_list("drizzle-host"); - if (SB_LIST_IS_EMPTY(args.hosts)) - { - log_text(LOG_FATAL, "No Drizzle hosts specified, aborting"); - return 1; - } - hosts_pos = args.hosts; - pthread_mutex_init(&hosts_mutex, NULL); - - args.port = (unsigned int)sb_get_value_int("drizzle-port"); - args.socket = sb_get_value_string("drizzle-socket"); - args.user = sb_get_value_string("drizzle-user"); - args.password = sb_get_value_string("drizzle-password"); - args.db = sb_get_value_string("drizzle-db"); - s= sb_get_value_string("drizzle-buffer"); - if (!strcasecmp(s, "none")) - args.buffer= BUFFER_NONE; - else if (!strcasecmp(s, "field")) - args.buffer= BUFFER_FIELD; - else if (!strcasecmp(s, "row")) - args.buffer= BUFFER_ROW; - else if (!strcasecmp(s, "all")) - args.buffer= BUFFER_ALL; - - args.mysql= sb_get_value_flag("drizzle-mysql"); - - return 0; -} - - -/* Describe database capabilities (possibly depending on table type) */ - - -int drizzle_drv_describe(drv_caps_t *caps ) -{ - *caps = drizzle_drv_caps; - - return 0; -} - - -/* Connect to Drizzle database */ - - -int drizzle_drv_connect(db_conn_t *sb_conn) -{ - drizzle_st *drizzle_lib= NULL; - drizzle_con_st *con= NULL; - const char *host; - drizzle_return_t ret; - - drizzle_lib= drizzle_create(drizzle_lib); - - if (args.socket) - { - DEBUG("drizzle_con_add_uds(%p, %p \"%s\", \"%s\", \"%s\", \"%s\", %d)", - drizzle_lib, - con, - args.socket, - args.user, - args.password, - args.db, - args.mysql ? DRIZZLE_CON_MYSQL : 0); - con= drizzle_con_add_uds(drizzle_lib, - con, - args.socket, - args.user, - args.password, - args.db, - args.mysql ? DRIZZLE_CON_MYSQL : 0); - } else { - - pthread_mutex_lock(&hosts_mutex); - hosts_pos = SB_LIST_ITEM_NEXT(hosts_pos); - if (hosts_pos == args.hosts) - hosts_pos = SB_LIST_ITEM_NEXT(hosts_pos); - host = SB_LIST_ENTRY(hosts_pos, value_t, listitem)->data; - pthread_mutex_unlock(&hosts_mutex); - - DEBUG("drizzle_con_add_tcp(%p, %p \"%s\", %u, \"%s\", \"%s\", \"%s\", %d)", - drizzle_lib, - con, - host, - args.port, - args.user, - args.password, - args.db, - args.mysql ? DRIZZLE_CON_MYSQL : 0); - con= drizzle_con_add_tcp(drizzle_lib, - con, - host, - args.port, - args.user, - args.password, - args.db, - args.mysql ? DRIZZLE_CON_MYSQL : 0); - } - - if (con == NULL) - { - log_text(LOG_FATAL, "unable to Add Drizzle Connection, aborting..."); - log_text(LOG_FATAL, "error %d: %s", drizzle_errno(drizzle_lib), - drizzle_error(drizzle_lib)); - return 1; - } - if ((ret= drizzle_con_connect(con)) != DRIZZLE_RETURN_OK) - { - log_text(LOG_FATAL, "unable to connect to Drizzle server: %d", ret); - log_text(LOG_FATAL, "error %d: %s", drizzle_errno(drizzle_lib), - drizzle_error(drizzle_lib)); - free(con); - return 1; - - } - sb_conn->ptr = con; - - return 0; -} - - -/* Disconnect from Drizzle database */ - - -int drizzle_drv_disconnect(db_conn_t *sb_conn) -{ - drizzle_con_st *con = (drizzle_con_st *)sb_conn->ptr; - - if (con != NULL) - { - DEBUG("drizzle_close(%p)", con); - drizzle_con_close(con); - free(con); - } - return 0; -} - - -/* Prepare statement */ - - -int drizzle_drv_prepare(db_stmt_t *stmt, const char *query, size_t len) -{ - - (void) len; /* unused */ - - /* Use client-side PS */ - stmt->emulated = 1; - stmt->query = strdup(query); - - return 0; -} - - -/* Bind parameters for prepared statement */ -int drizzle_drv_bind_param(db_stmt_t *stmt, db_bind_t *params, size_t len) -{ - drizzle_con_st *con = (drizzle_con_st *)stmt->connection->ptr; - - if (con == NULL) - return 1; - - /* Use emulation */ - if (stmt->bound_param != NULL) - free(stmt->bound_param); - stmt->bound_param = (db_bind_t *)malloc(len * sizeof(db_bind_t)); - if (stmt->bound_param == NULL) - return 1; - memcpy(stmt->bound_param, params, len * sizeof(db_bind_t)); - stmt->bound_param_len = len; - - return 0; - -} - - -/* Bind results for prepared statement */ -int drizzle_drv_bind_result(db_stmt_t *stmt, db_bind_t *params, size_t len) -{ - (void)stmt; - (void)params; - (void)len; - return 0; -} - - -/* Execute prepared statement */ - - -db_error_t drizzle_drv_execute(db_stmt_t *stmt, db_result_t *rs) -{ - db_conn_t *con = stmt->connection; - char *buf = NULL; - unsigned int buflen = 0; - unsigned int i, j, vcnt; - char need_realloc; - int n; - - /* Use emulation */ - /* Build the actual query string from parameters list */ - need_realloc = 1; - vcnt = 0; - for (i = 0, j = 0; stmt->query[i] != '\0'; i++) - { - again: - if (j+1 >= buflen || need_realloc) - { - buflen = (buflen > 0) ? buflen * 2 : 256; - buf = realloc(buf, buflen); - if (buf == NULL) - { - log_text(LOG_DEBUG, "ERROR: exiting drizzle_drv_execute(), memory allocation failure"); - return DB_ERROR_FATAL; - } - need_realloc = 0; - } - - if (stmt->query[i] != '?') - { - buf[j++] = stmt->query[i]; - continue; - } - - n = db_print_value(stmt->bound_param + vcnt, buf + j, (int)(buflen - j)); - if (n < 0) - { - need_realloc = 1; - goto again; - } - j += (unsigned int)n; - vcnt++; - } - buf[j] = '\0'; - - con->error = drizzle_drv_query(con, buf, j, rs); - free(buf); - if (con->error != DB_ERROR_NONE) - { - log_text(LOG_DEBUG, "ERROR: exiting drizzle_drv_execute(), database error"); - return con->error; - } - - return DB_ERROR_NONE; -} - - -/* Execute SQL query */ - - -db_error_t drizzle_drv_query(db_conn_t *sb_conn, const char *query, size_t len, - db_result_t *rs) -{ - drizzle_con_st *con = sb_conn->ptr; - unsigned int rc; - drizzle_return_t ret; - drizzle_result_st *result= NULL; - - DEBUG("drizzle_query(%p, %p, \"%s\", %u, %p)", - con, - result, - query, - len, - &ret); - result= drizzle_query(con, NULL, query, len, &ret); - DEBUG("drizzle_query(%p) == %d", con, ret); - - if (ret == DRIZZLE_RETURN_ERROR_CODE) - { - rc= drizzle_result_error_code(result); - /* Error code constants haven't been added yet to libdrizzle - ER_LOCK_DEADLOCK==1213 - ER_LOCK_WAIT_TIMEOUT==1205 - ER_CHECKREAD==1020 - */ - if (rc == 1213 || rc == 1205 || - rc == 1020) - return DB_ERROR_IGNORABLE; - log_text(LOG_ALERT, "Drizzle Query Failed: %u:%s", - drizzle_result_error_code(result), - drizzle_result_error(result)); - return DB_ERROR_FATAL; - } - else if (ret != DRIZZLE_RETURN_OK) - { - rc = drizzle_con_errno(con); - DEBUG("drizzle_errno(%p) = %u", drizzle_con_drizzle(con), rc); - log_text(LOG_ALERT, "failed to execute Drizzle query: len==%d `%s`:", - strlen(query), query); - log_text(LOG_ALERT, "Error %d %s", drizzle_con_errno(con), - drizzle_con_error(con)); - return DB_ERROR_FATAL; - } - DEBUG("drizzle_query \"%s\" returned %d", query, ret); - - if (result == NULL) - { - DEBUG("drizzle_query(%p, \"%s\") == NULL",con,query); - return DB_ERROR_FATAL; - } - - - rs->ptr= result; - rs->nrows= drizzle_result_row_count(result); - DEBUG("drizzle_result_row_count(%p) == %d",result,rs->nrows); - - return DB_ERROR_NONE; -} - - -/* Fetch row from result set of a prepared statement */ - - -int drizzle_drv_fetch(db_result_t *rs) -{ - /* NYI */ - (void)rs; - printf("in drizzle_drv_fetch_row!\n"); - - return 1; -} - - -/* Fetch row from result set of a query */ - - -int drizzle_drv_fetch_row(db_result_t *rs, db_row_t *row) -{ - /* NYI */ - printf("in drizzle_drv_fetch_row!\n"); - (void)rs; /* unused */ - (void)row; /* unused */ - - return 1; -} - - -/* Store results from the last query */ - - -int drizzle_drv_store_results(db_result_t *rs) -{ - - drizzle_con_st *con = rs->connection->ptr; - drizzle_result_st *res = rs->ptr; - drizzle_return_t ret; - drizzle_column_st *column= NULL; - unsigned int rc; - - - if (con == NULL || res == NULL) - return DB_ERROR_FATAL; - - - if (args.buffer == BUFFER_ALL) - { - - ret= drizzle_result_buffer(res); - DEBUG("drizzle_result_buffer(%p) = %d", res, ret); - if (ret != DRIZZLE_RETURN_OK) - { - rc = drizzle_con_errno(con); - DEBUG("drizzle_errno(%p) = %u", drizzle_con_drizzle(con), rc); - log_text(LOG_ALERT, "drizzle_result_buffer failed: `%p`:", res); - log_text(LOG_ALERT, "Error %d %s", - drizzle_con_errno(con), - drizzle_con_error(con)); - return DB_ERROR_FATAL; - } - while ((column = drizzle_column_next(res)) != NULL) - column_info(column); - } - else if (drizzle_result_column_count(res) > 0) - { - - drizzle_row_t row; - drizzle_field_t field; - uint64_t row_num; - size_t offset= 0; - size_t length; - size_t total; - - /* Read column meta-info */ - while (1) - { - column= drizzle_column_read(res, column, &ret); - DEBUG("drizzle_column_read(%p,%p,%p) == %d",res, column, &ret, ret); - if (ret != DRIZZLE_RETURN_OK) - { - rc = drizzle_con_errno(con); - DEBUG("drizzle_errno(%p) = %u", drizzle_con_drizzle(con), rc); - log_text(LOG_ALERT, "drizzle_column_read failed: `%p`:", res); - log_text(LOG_ALERT, "Error %d %s", - drizzle_con_errno(con), - drizzle_con_error(con)); - return DB_ERROR_FATAL; - } - if (column == NULL) - break; - - column_info(column); - drizzle_column_free(column); - } - - /* Actually fetch rows */ - while (1) /* Loop for rows */ - { - if (args.buffer == BUFFER_ROW) - { - row= drizzle_row_buffer(res, &ret); - DEBUG("drizzle_row_buffer(%p, %p) == %p, %d",res, &ret, row, ret); - if (ret != DRIZZLE_RETURN_OK) - { - rc = drizzle_con_errno(con); - DEBUG("drizzle_errno(%p) = %u", drizzle_con_drizzle(con), rc); - log_text(LOG_ALERT, "drizzle_row_buffer failed: `%p`:", res); - log_text(LOG_ALERT, "Error %d %s", - drizzle_con_errno(con), - drizzle_con_error(con)); - return DB_ERROR_FATAL; - } - - if (row == NULL) - break; - - DEBUG("drizzle_row_free(%p, %p)",res,row); - drizzle_row_free(res, row); - } - else if (args.buffer == BUFFER_NONE || args.buffer == BUFFER_FIELD) - { - row_num= drizzle_row_read(res, &ret); - DEBUG("drizzle_row_read(%p, %p) == %"PRIu64", %d", - res, &ret, row_num, ret); - if (ret != DRIZZLE_RETURN_OK) - { - rc = drizzle_con_errno(con); - DEBUG("drizzle_errno(%p) = %u", drizzle_con_drizzle(con), rc); - log_text(LOG_ALERT, "drizzle_row_read failed: `%p`:", res); - log_text(LOG_ALERT, "Error %d %s", - drizzle_con_errno(con), - drizzle_con_error(con)); - return DB_ERROR_FATAL; - } - - if (row_num == 0) - break; - - while (1) /* Loop for fields */ - { - - if (args.buffer == BUFFER_FIELD) - { - /* Since an entire field is buffered, we don't need to worry about - partial reads. */ - field= drizzle_field_buffer(res, &total, &ret); - DEBUG("drizzle_field_buffer(%p, &p, %p) == %p, %x, %d", - res, &total, &ret, field, total, ret); - length= total; - } - else - { - field= drizzle_field_read(res, &offset, &length, &total, &ret); - DEBUG("drizzle_field_read(%p, %p, %p, %p, %p) == " - "%p, %x, %x, %x, %d", - res, &offset, &length, &total, &ret, - field, offset, length, total, ret); - } - - if (ret == DRIZZLE_RETURN_ROW_END) - break; - else if (ret != DRIZZLE_RETURN_OK) - { - rc = drizzle_con_errno(con); - DEBUG("drizzle_errno(%p) = %u", drizzle_con_drizzle(con), rc); - log_text(LOG_ALERT, "drizzle_field_(buffer|read) failed: `%p`:", - res); - log_text(LOG_ALERT, "Error %d %s", - drizzle_con_errno(con), - drizzle_con_error(con)); - return DB_ERROR_FATAL; - } - - if (args.buffer == BUFFER_FIELD) - drizzle_field_free(field); - - } /* while (1) Loop for fields */ - - } /* if (args.buffer) */ - - } /* while (1) */ - } - return DB_ERROR_NONE; -} - - -/* Free result set */ - - -int drizzle_drv_free_results(db_result_t *rs) -{ - - if (rs->ptr != NULL) - { - DEBUG("drizzle_result_free(%p)", rs->ptr); - drizzle_result_free(rs->ptr); - rs->ptr = NULL; - return 0; - } - - return 1; -} - - -/* Close prepared statement */ - - -int drizzle_drv_close(db_stmt_t *stmt) -{ - (void)stmt; - return 0; -} - - -/* Uninitialize driver */ -int drizzle_drv_done(void) -{ - return 0; -} - - -void column_info(drizzle_column_st *column) -{ - DEBUG("Field: catalog=%s\n" - " db=%s\n" - " table=%s\n" - " org_table=%s\n" - " name=%s\n" - " org_name=%s\n" - " charset=%u\n" - " size=%u\n" - " type=%u\n" - " flags=%u\n", - drizzle_column_catalog(column), drizzle_column_db(column), - drizzle_column_table(column), drizzle_column_orig_table(column), - drizzle_column_name(column), drizzle_column_orig_name(column), - drizzle_column_charset(column), drizzle_column_size(column), - drizzle_column_type(column), drizzle_column_flags(column)); -} - diff --git a/src/drivers/oracle/Makefile.am b/src/drivers/oracle/Makefile.am deleted file mode 100644 index f5d4529..0000000 --- a/src/drivers/oracle/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (C) 2005 MySQL AB -# Copyright (C) 2005-2008 Alexey Kopytov -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -noinst_LIBRARIES = libsboracle.a - -libsboracle_a_SOURCES = drv_oracle.c -libsboracle_a_CPPFLAGS = $(ORA_CFLAGS) $(AM_CPPFLAGS) diff --git a/src/drivers/oracle/drv_oracle.c b/src/drivers/oracle/drv_oracle.c deleted file mode 100644 index da30f10..0000000 --- a/src/drivers/oracle/drv_oracle.c +++ /dev/null @@ -1,1114 +0,0 @@ -/* Copyright (C) 2005 MySQL AB - Copyright (C) 2005-2008 Alexey Kopytov - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#ifdef HAVE_STRING_H -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif - -#include - -#include "sb_options.h" -#include "db_driver.h" - - -/* Number of rows to prefetch for result sets */ -#define ORA_DRV_PREFETCH_COUNT 1000 - -#define CHECKERR(stmt) \ - do { \ - if (rc != OCI_SUCCESS) \ - { \ - log_text(LOG_FATAL, "%s failed in %s:%d", stmt, __FILE__, __LINE__); \ - checkerr(ora_con->errhp, rc); \ - goto error; \ - } \ - } while(0); - -static sb_arg_t ora_drv_args[] = -{ - {"oracle-user", "Oracle user", SB_ARG_TYPE_STRING, "sbtest"}, - {"oracle-password", "Oracle password", SB_ARG_TYPE_STRING, ""}, - {"oracle-db", "Oracle database name", SB_ARG_TYPE_STRING, "sbtest"}, - - {NULL, NULL, SB_ARG_TYPE_NULL, NULL} -}; - -typedef struct -{ - OCISvcCtx *svchp; - OCIServer *srvhp; - OCIError *errhp; - OCITrans *transhp; - OCISession *usrhp; -} ora_conn_t; - -typedef struct -{ - sb2 ind; -} ora_bind_t; - -typedef enum -{ - STMT_TYPE_BEGIN, - STMT_TYPE_COMMIT, - STMT_TYPE_SELECT, - STMT_TYPE_UPDATE -} ora_stmt_type_t; - -typedef struct -{ - OCIStmt *ptr; - ora_stmt_type_t type; - ora_bind_t *params; - ora_bind_t *results; -} ora_stmt_t; - -typedef struct -{ - ub2 type; - text *name; - ub2 len; - OCIDefine *defhp; - void *value; - sb2 ind; - - sb_list_item_t listitem; -} ora_column_t; - -typedef struct -{ - void *value; - sb2 ind; -} ora_data_t; - -typedef struct -{ - ora_data_t *data; - sb_list_item_t listitem; -} ora_row_t; - -typedef struct -{ - ub4 ncolumns; - ub4 nrows; - sb_list_t columns; - sb_list_t rows; -} ora_result_set_t; - -typedef struct -{ - char *user; - char *password; - unsigned char *db; -} ora_drv_args_t; - -/* Structure used for DB-to-Oracle bind types map */ - -typedef struct -{ - db_bind_type_t db_type; - ub2 ora_type; - sb4 ora_len; -} db_oracle_bind_map_t; - -/* DB-to-Oracle bind types map */ -db_oracle_bind_map_t db_oracle_bind_map[] = -{ - - {DB_TYPE_TINYINT, SQLT_INT, sizeof(char)}, - {DB_TYPE_SMALLINT, SQLT_INT, sizeof(short)}, - {DB_TYPE_INT, SQLT_INT, sizeof(int)} , - {DB_TYPE_BIGINT, SQLT_INT, sizeof(long long)}, - {DB_TYPE_FLOAT, SQLT_FLT, sizeof(float)}, - {DB_TYPE_DOUBLE, SQLT_FLT, sizeof(double)}, - {DB_TYPE_DATETIME, SQLT_DATE, sizeof(void *)}, - {DB_TYPE_TIMESTAMP, SQLT_TIMESTAMP, sizeof(void *)}, - {DB_TYPE_CHAR, SQLT_AFC, 0}, - {DB_TYPE_VARCHAR, SQLT_VCS, 0}, - {DB_TYPE_NONE, 0, 0} -}; - -/* Oracle driver capabilities */ - -static drv_caps_t ora_drv_caps = -{ - .multi_rows_insert = 0, - .prepared_statements = 1, - .needs_commit = 1, -}; - - -static OCIEnv *ora_env; /* OCI environmental handle */ - -static ora_drv_args_t args; /* driver args */ - -/* Oracle driver operations */ - -static int ora_drv_init(void); -static int ora_drv_describe(drv_caps_t *); -static int ora_drv_connect(db_conn_t *); -static int ora_drv_disconnect(db_conn_t *); -static int ora_drv_prepare(db_stmt_t *, const char *, size_t); -static int ora_drv_bind_param(db_stmt_t *, db_bind_t *, size_t); -static int ora_drv_bind_result(db_stmt_t *, db_bind_t *, size_t); -static db_error_t ora_drv_execute(db_stmt_t *, db_result_t *); -static int ora_drv_fetch(db_result_t *); -static int ora_drv_fetch_row(db_result_t *, db_row_t *); -static db_error_t ora_drv_query(db_conn_t *, const char *, size_t, - db_result_t *); -static int ora_drv_free_results(db_result_t *); -static int ora_drv_close(db_stmt_t *); -static int ora_drv_store_results(db_result_t *); -static int ora_drv_done(void); - -/* Oracle driver definition */ - -static db_driver_t oracle_driver = -{ - .sname = "oracle", - .lname = "Oracle driver", - .args = ora_drv_args, - .ops = - { - .init = ora_drv_init, - .describe = ora_drv_describe, - .connect = ora_drv_connect, - .disconnect = ora_drv_disconnect, - .prepare = ora_drv_prepare, - .bind_param = ora_drv_bind_param, - .bind_result = ora_drv_bind_result, - .execute = ora_drv_execute, - .fetch = ora_drv_fetch, - .fetch_row = ora_drv_fetch_row, - .free_results = ora_drv_free_results, - .close = ora_drv_close, - .query = ora_drv_query, - .store_results = ora_drv_store_results, - .done = ora_drv_done - } -}; - - -/* Local functions */ - -static sword get_oracle_bind_type(db_bind_t *, ub2 *, sb4 *, sb2 *); -static sb4 get_oracle_type_size(sword); -static ora_stmt_type_t get_stmt_type(const char *); -static void checkerr(OCIError *, sword); - -/* Register Oracle driver */ - - -int register_driver_oracle(sb_list_t *drivers) -{ - SB_LIST_ADD_TAIL(&oracle_driver.listitem, drivers); - - return 0; -} - - -/* Oracle driver initialization */ - - -int ora_drv_init(void) -{ - sword rc; - - args.user = sb_get_value_string("oracle-user"); - args.password = sb_get_value_string("oracle-password"); - args.db = sb_get_value_string("oracle-db"); - - /* Initialize the environment */ - rc = OCIEnvCreate(&ora_env, OCI_THREADED | OCI_OBJECT, NULL, NULL, NULL, NULL, - 0, NULL); - if (rc != OCI_SUCCESS || ora_env == NULL) - { - log_text(LOG_FATAL, "OCIEnvCreate failed!"); - return 1; - } - - return 0; -} - - -/* Describe database capabilities */ - - -int ora_drv_describe(drv_caps_t *caps) -{ - *caps = ora_drv_caps; - - return 0; -} - - -/* Connect to the database */ - - -int ora_drv_connect(db_conn_t *sb_conn) -{ - sword rc; - ora_conn_t *ora_con = NULL; - - ora_con = (ora_conn_t *)malloc(sizeof(ora_conn_t)); - if (ora_con == NULL) - goto error; - - /* Allocate a service handle */ - rc = OCIHandleAlloc(ora_env, (dvoid **)&(ora_con->svchp), OCI_HTYPE_SVCCTX, 0, - (dvoid **)NULL); - if (rc != OCI_SUCCESS) - { - log_text(LOG_FATAL, "OCIHandleAlloc (OCI_HTYPE_SVCCTX) failed"); - goto error; - } - - /* Allocate an error handle */ - rc = OCIHandleAlloc(ora_env, (dvoid **)&(ora_con->errhp), OCI_HTYPE_ERROR, 0, - (dvoid **)NULL); - if (rc != OCI_SUCCESS) - { - log_text(LOG_FATAL, "OCIHandleAlloc (OCI_HTYPE_ERROR) failed"); - goto error; - } - - /* Allocate an server handle */ - rc = OCIHandleAlloc(ora_env, (dvoid **)&(ora_con->srvhp), OCI_HTYPE_SERVER, 0, - (dvoid **)NULL); - CHECKERR("OCIHandleAlloc"); - - /* Allocate a user session handle */ - rc = OCIHandleAlloc(ora_env, (dvoid **)&(ora_con->usrhp), OCI_HTYPE_SESSION, 0, - (dvoid **)NULL); - CHECKERR("OCIHandleAlloc"); - - /* Attach to the server */ - rc = OCIServerAttach(ora_con->srvhp, ora_con->errhp, args.db, strlen(args.db), - OCI_DEFAULT); - CHECKERR("OCIServerAttach"); - - /* Set the server attribute in the service context handler */ - rc = OCIAttrSet(ora_con->svchp, OCI_HTYPE_SVCCTX, ora_con->srvhp, 0, - OCI_ATTR_SERVER, ora_con->errhp); - CHECKERR("OCIAttrSet"); - - /* Set the user name attribute in the user session handler */ - rc = OCIAttrSet(ora_con->usrhp, OCI_HTYPE_SESSION, args.user, - strlen(args.user), OCI_ATTR_USERNAME, ora_con->errhp); - CHECKERR("OCIAttrSet"); - - /* Set the password attribute in the user session handler */ - rc = OCIAttrSet(ora_con->usrhp, OCI_HTYPE_SESSION, args.password, - strlen(args.password), OCI_ATTR_PASSWORD, ora_con->errhp); - CHECKERR("OCIAttrSet"); - - /* Allocate the transaction handle and set it to service context */ - rc = OCIHandleAlloc(ora_env, (dvoid **)&(ora_con->transhp), OCI_HTYPE_TRANS, 0, - (dvoid **)NULL); - CHECKERR("OCIHandleAlloc"); - rc = OCIAttrSet(ora_con->svchp, OCI_HTYPE_SVCCTX, ora_con->transhp, 0, - OCI_ATTR_TRANS, ora_con->errhp); - CHECKERR("OCIAttrSet"); - - /* Start the session */ - rc = OCISessionBegin (ora_con->svchp, ora_con->errhp, ora_con->usrhp, - OCI_CRED_RDBMS, OCI_DEFAULT); - CHECKERR("OCISessionBegin"); - - /* Set the user session attribute in the service context handler */ - rc = OCIAttrSet(ora_con->svchp, OCI_HTYPE_SVCCTX, ora_con->usrhp, 0, - OCI_ATTR_SESSION, ora_con->errhp); - CHECKERR("OCIAttrSet"); - - sb_conn->ptr = ora_con; - - return 0; - - error: - if (ora_con != NULL) - free(ora_con); - - return 1; -} - - -/* Disconnect from database */ - - -int ora_drv_disconnect(db_conn_t *sb_conn) -{ - ora_conn_t *con = sb_conn->ptr; - sword rc; - int res = 0; - - if (con == NULL) - return 1; - - rc = OCISessionEnd(con->svchp, con->errhp, con->usrhp, 0); - if (rc != OCI_SUCCESS) - { - log_text(LOG_FATAL, "OCISessionEnd failed"); - res = 1; - } - - rc = OCIServerDetach(con->srvhp, con->errhp, OCI_DEFAULT); - if (rc != OCI_SUCCESS) - { - log_text(LOG_FATAL, "OCIServerDetach failed"); - res = 1; - } - - /* Free handles */ - - if (OCIHandleFree(con->usrhp, OCI_HTYPE_SESSION) != OCI_SUCCESS) - res = 1; - if (OCIHandleFree(con->srvhp, OCI_HTYPE_SERVER) != OCI_SUCCESS) - res = 1; - if (OCIHandleFree(con->svchp, OCI_HTYPE_SVCCTX) != OCI_SUCCESS) - res = 1; - if (OCIHandleFree(con->errhp, OCI_HTYPE_ERROR) != OCI_SUCCESS) - res = 1; - - free(con); - - return res; -} - - -/* Prepare statement */ - - -int ora_drv_prepare(db_stmt_t *stmt, const char *query, size_t len) -{ - ora_conn_t *ora_con = (ora_conn_t *)stmt->connection->ptr; - sword rc; - ora_stmt_t *ora_stmt = NULL; - char *buf = NULL; - unsigned int vcnt; - unsigned int need_realloc; - unsigned int i,j; - unsigned int buflen; - int n; - ub4 prefetch_cnt = ORA_DRV_PREFETCH_COUNT; - - if (ora_con == NULL) - return 1; - - if (db_globals.ps_mode != DB_PS_MODE_DISABLE) - { - ora_stmt = (ora_stmt_t *)calloc(1, sizeof(ora_stmt_t)); - if (ora_stmt == NULL) - goto error; - - rc = OCIHandleAlloc(ora_env, (dvoid **)&(ora_stmt->ptr), OCI_HTYPE_STMT, 0, - NULL); - if (rc != OCI_SUCCESS) - goto error; - - /* Convert query to Oracle-style named placeholders */ - need_realloc = 1; - vcnt = 1; - buflen = 0; - for (i = 0, j = 0; query[i] != '\0'; i++) - { - again: - if (j+1 >= buflen || need_realloc) - { - buflen = (buflen > 0) ? buflen * 2 : 256; - buf = realloc(buf, buflen); - if (buf == NULL) - goto error; - need_realloc = 0; - } - - if (query[i] != '?') - { - buf[j++] = query[i]; - continue; - } - - n = snprintf(buf + j, buflen - j, ":%d", vcnt); - if (n < 0 || n >= (int)(buflen - j)) - { - need_realloc = 1; - goto again; - } - - j += n; - vcnt++; - } - buf[j] = '\0'; - - ora_stmt->type = get_stmt_type(buf); - - if (ora_stmt->type != STMT_TYPE_BEGIN && - ora_stmt->type != STMT_TYPE_COMMIT) - { - rc = OCIStmtPrepare(ora_stmt->ptr, ora_con->errhp, buf, j, - OCI_NTV_SYNTAX, OCI_DEFAULT); - CHECKERR("OCIStmtPrepare"); - - rc = OCIAttrSet(ora_stmt->ptr, OCI_HTYPE_STMT, &prefetch_cnt, 0, - OCI_ATTR_PREFETCH_ROWS, ora_con->errhp); - CHECKERR("OCIAttrSet"); - } - - free(buf); - - stmt->ptr = (void *)ora_stmt; - } - else - { - /* Use client-side PS */ - stmt->emulated = 1; - } - stmt->query = strdup(query); - - return 0; - - error: - if (ora_stmt != NULL) - { - if (ora_stmt->ptr != NULL) - OCIHandleFree(ora_stmt->ptr, OCI_HTYPE_STMT); - - free(ora_stmt); - } - log_text(LOG_FATAL, "Failed to prepare statement: '%s'", query); - - return 1; -} - - -/* Bind parameters for prepared statement */ - - -int ora_drv_bind_param(db_stmt_t *stmt, db_bind_t *params, size_t len) -{ - ora_conn_t *con = (ora_conn_t *)stmt->connection->ptr; - ora_stmt_t *ora_stmt = (ora_stmt_t *)stmt->ptr; - OCIBind * bindp; - unsigned int i; - sword rc; - ub2 dtype; - sb4 dlen; - - if (con == NULL) - return 1; - - if (!stmt->emulated) - { - if (ora_stmt == NULL || ora_stmt->ptr == NULL) - return 1; - - if (ora_stmt->params != NULL) - free(ora_stmt->params); - ora_stmt->params = (ora_bind_t *)malloc(len * sizeof(ora_bind_t)); - if (ora_stmt->params == NULL) - return 1; - - /* Convert sysbench bind structures to Oracle ones */ - bindp = NULL; - for (i = 0; i < len; i++) - { - if (get_oracle_bind_type(params+i, &dtype, &dlen, - &ora_stmt->params[i].ind)) - { - free(ora_stmt->params); - ora_stmt->params = NULL; - return 1; - } - - rc = OCIBindByPos(ora_stmt->ptr, &bindp, con->errhp, i+1, params[i].buffer, - dlen, dtype, (dvoid *)&ora_stmt->params[i].ind, NULL, - NULL, 0, NULL, OCI_DEFAULT); - if (rc != OCI_SUCCESS) - { - log_text(LOG_FATAL, "OCIBindByPos failed"); - free(ora_stmt->params); - ora_stmt->params = NULL; - return 1; - } - } - - return 0; - } - - /* Use emulation */ - if (stmt->bound_param != NULL) - free(stmt->bound_param); - stmt->bound_param = (db_bind_t *)malloc(len * sizeof(db_bind_t)); - if (stmt->bound_param == NULL) - return 1; - memcpy(stmt->bound_param, params, len * sizeof(db_bind_t)); - stmt->bound_param_len = len; - - return 0; -} - - -/* Bind results for prepared statement */ - - -int ora_drv_bind_result(db_stmt_t *stmt, db_bind_t *params, size_t len) -{ - /* NYI */ - - (void)stmt; - (void)params; - (void)len; - - return 1; -} - - -/* Execute prepared statement */ - - -db_error_t ora_drv_execute(db_stmt_t *stmt, db_result_t *rs) -{ - db_conn_t *db_con = stmt->connection; - ora_stmt_t *ora_stmt = stmt->ptr; - ora_conn_t *ora_con; - ub4 iters; - char *buf = NULL; - unsigned int buflen = 0; - unsigned int i, j, vcnt; - char need_realloc; - int n; - sword rc; - - (void)rs; /* unused */ - - if (db_con == NULL) - return DB_ERROR_FATAL; - ora_con = db_con->ptr; - if (ora_con == NULL) - return DB_ERROR_FATAL; - - if (!stmt->emulated) - { - if (stmt->ptr == NULL) - return DB_ERROR_FATAL; - - if (ora_stmt->type == STMT_TYPE_BEGIN) - { - rc = OCITransStart(ora_con->svchp, ora_con->errhp, 3600, OCI_TRANS_NEW); - CHECKERR("OCITransStart"); - - return DB_ERROR_NONE; - } - else if (ora_stmt->type == STMT_TYPE_COMMIT) - { - rc = OCITransCommit(ora_con->svchp, ora_con->errhp, OCI_DEFAULT); - CHECKERR("OCITransCommit"); - - return DB_ERROR_NONE; - } - else if (ora_stmt->type == STMT_TYPE_SELECT) - iters = 0; - else - iters = 1; - - rc = OCIStmtExecute(ora_con->svchp, ora_stmt->ptr, ora_con->errhp, iters, 0, - NULL, NULL, OCI_DEFAULT); - CHECKERR("OCIStmtExecute"); - - return DB_ERROR_NONE; - } - - /* Build the actual query string from parameters list */ - need_realloc = 1; - vcnt = 0; - for (i = 0, j = 0; stmt->query[i] != '\0'; i++) - { - again: - if (j+1 >= buflen || need_realloc) - { - buflen = (buflen > 0) ? buflen * 2 : 256; - buf = realloc(buf, buflen); - if (buf == NULL) - { - return DB_ERROR_FATAL; - } - need_realloc = 0; - } - - if (stmt->query[i] != '?') - { - buf[j++] = stmt->query[i]; - continue; - } - - n = db_print_value(stmt->bound_param + vcnt, buf + j, buflen - j); - if (n < 0) - { - need_realloc = 1; - goto again; - } - j += n; - vcnt++; - } - buf[j] = '\0'; - - db_con->error = ora_drv_query(db_con, buf, j, rs); - free(buf); - - return DB_ERROR_NONE; - - error: - log_text(LOG_FATAL, "failed query was: '%s'", stmt->query); - - return DB_ERROR_FATAL; -} - - -/* Execute SQL query */ - - -db_error_t ora_drv_query(db_conn_t *sb_conn, const char *query, size_t len, - db_result_t *rs) -{ - ora_conn_t *ora_con = sb_conn->ptr; - sword rc = 0; - void *tmp = NULL; - ub4 iters; - ora_stmt_type_t type; - OCIStmt *stmt = NULL; - - (void)rs; /* unused */ - - type = get_stmt_type(query); - - if (type == STMT_TYPE_BEGIN) - { - rc = OCITransStart(ora_con->svchp, ora_con->errhp, 3600, OCI_TRANS_NEW); - CHECKERR("OCITransStart"); - - return DB_ERROR_NONE; - } - else if (type == STMT_TYPE_COMMIT) - { - rc = OCITransCommit(ora_con->svchp, ora_con->errhp, OCI_DEFAULT); - CHECKERR("OCITransCommit"); - - return DB_ERROR_NONE; - } - else if (type == STMT_TYPE_SELECT) - iters = 0; - else - iters = 1; - - rc = OCIHandleAlloc(ora_env, (dvoid **)&tmp, OCI_HTYPE_STMT, 0, (dvoid **)NULL); - CHECKERR("OCIHandleAlloc"); - - stmt = (OCIStmt *)tmp; - - rc = OCIStmtPrepare(stmt, ora_con->errhp, (OraText *)query, len, - OCI_NTV_SYNTAX, OCI_DEFAULT); - CHECKERR("OCIStmtPrepare"); - - rc = OCIStmtExecute(ora_con->svchp, stmt, ora_con->errhp, iters, 0, NULL, NULL, - OCI_DEFAULT); - CHECKERR("OCIStmtExecute"); - - OCIHandleFree(stmt, OCI_HTYPE_STMT); - - return DB_ERROR_NONE; - - error: - log_text(LOG_FATAL, "failed query was: '%s'", query); - if (stmt != NULL) - OCIHandleFree(stmt, OCI_HTYPE_STMT); - - return DB_ERROR_FATAL; -} - - -/* Fetch row from result set of a prepared statement */ - - -int ora_drv_fetch(db_result_t *rs) -{ - /* NYI */ - (void)rs; - - return 1; -} - - -/* Fetch row from result set of a query */ - - -int ora_drv_fetch_row(db_result_t *rs, db_row_t *row) -{ - /* NYI */ - (void)rs; /* unused */ - (void)row; /* unused */ - - return 1; -} - - -/* Store results from the last query */ - - -int ora_drv_store_results(db_result_t *rs) -{ - unsigned int i; - sword rc; - db_stmt_t *db_stmt = rs->statement; - db_conn_t *db_conn = rs->connection; - ora_stmt_t *ora_stmt; - ora_conn_t *ora_con; - ora_result_set_t *ora_rs; - ora_column_t *column; - ora_row_t *row; - OCIParam *parm; - void *tmp = NULL; - unsigned int col_len; - ub4 semantics; - sb_list_item_t *pos; - text *fnamep; - - if (db_stmt == NULL || db_conn == NULL) - return 1; - - ora_stmt = (ora_stmt_t *)db_stmt->ptr; - ora_con = (ora_conn_t *)db_conn->ptr; - if (ora_stmt == NULL || ora_con == NULL) - return 1; - - if (rs->ptr != NULL) - return 1; - ora_rs = (ora_result_set_t *)calloc(1, sizeof(ora_result_set_t)); - if (ora_rs == NULL) - return 1; - rs->ptr = ora_rs; - SB_LIST_INIT(&ora_rs->columns); - SB_LIST_INIT(&ora_rs->rows); - - i = 1; - rc = OCIParamGet((dvoid *)ora_stmt->ptr, OCI_HTYPE_STMT, ora_con->errhp, - (dvoid **)&tmp, i); - parm = (OCIParam *)tmp; - - /* Loop to get description of all columns */ - while (rc == OCI_SUCCESS) - { - column = (ora_column_t *)calloc(1, sizeof(ora_column_t)); - if (column == NULL) - goto error; - SB_LIST_ADD_TAIL(&column->listitem, &ora_rs->columns); - - /* Get the column type attribute */ - rc = OCIAttrGet((dvoid *)parm, OCI_DTYPE_PARAM, (dvoid *)&column->type, - NULL, OCI_ATTR_DATA_TYPE, ora_con->errhp); - CHECKERR("OCIAttrGet"); - - /* Get the column name attribute */ - rc = OCIAttrGet((dvoid *)parm, OCI_DTYPE_PARAM, &fnamep, - (ub4 *)&col_len, OCI_ATTR_NAME, ora_con->errhp); - CHECKERR("OCIAttrGet"); - column->name = (char *)malloc(col_len + 1); - if (column->name == NULL) - goto error; - strncpy(column->name, fnamep, col_len + 1); - - - /* Get the length semantics */ - rc = OCIAttrGet((dvoid *)parm, OCI_DTYPE_PARAM, (dvoid *)&semantics, - NULL, OCI_ATTR_CHAR_USED, ora_con->errhp); - CHECKERR("OCIAttrGet"); - - if (semantics) - { - /* Get the column width in characters */ - rc = OCIAttrGet((dvoid *)parm, OCI_DTYPE_PARAM, (dvoid *)&column->len, - NULL, OCI_ATTR_CHAR_SIZE, ora_con->errhp); - if (column->len == 0) - column->len = get_oracle_type_size(column->type); - } - else - { - /* Get the column width in bytes */ - rc = OCIAttrGet((dvoid *)parm, OCI_DTYPE_PARAM, (dvoid *)&column->len, - NULL, OCI_ATTR_DATA_SIZE, ora_con->errhp); - if (column->len == 0) - column->len = get_oracle_type_size(column->type); - } - CHECKERR("OCIAttrGet"); - - OCIDescriptorFree(parm, OCI_DTYPE_PARAM); - - /* Describe the column */ - column->value = malloc(column->len); - if (column->value == NULL) - goto error; - rc = OCIDefineByPos(ora_stmt->ptr, &column->defhp, ora_con->errhp, i, - column->value, column->len, column->type, &column->ind, - NULL, NULL, OCI_DEFAULT); - CHECKERR("OCIDefineByPos"); - - i++; - rc = OCIParamGet(ora_stmt->ptr, OCI_HTYPE_STMT, ora_con->errhp, - (dvoid **)&tmp, i); - parm = (OCIParam *)tmp; - } - ora_rs->ncolumns = i-1; - - /* Now fetch the actual data */ - while(1) - { - rc = OCIStmtFetch2(ora_stmt->ptr, ora_con->errhp, 1, OCI_FETCH_NEXT, 0, - OCI_DEFAULT); - if (rc == OCI_NO_DATA) - break; - CHECKERR("OCIStmtFetch"); - - row = (ora_row_t *)calloc(1, sizeof(ora_row_t)); - if (row == NULL) - goto error; - row->data = (ora_data_t *)calloc(ora_rs->ncolumns, sizeof(ora_data_t)); - i = 0; - SB_LIST_FOR_EACH(pos, &ora_rs->columns) - { - column = SB_LIST_ENTRY(pos, ora_column_t, listitem); - row->data[i].value = (void *)malloc(column->len); - if (row->data[i].value == NULL) - goto error; - memcpy(row->data[i].value, column->value, column->len); - row->data[i].ind = column->ind; - i++; - } - SB_LIST_ADD_TAIL(&row->listitem, &ora_rs->rows); - ora_rs->nrows++; - } - - return 0; - - error: - - return 1; -} - - -/* Free result set */ - - -int ora_drv_free_results(db_result_t *rs) -{ - ora_result_set_t *ora_rs = (ora_result_set_t *)rs->ptr; - ora_row_t *row; - ora_column_t *column; - sb_list_item_t *cur; - sb_list_item_t *next; - unsigned int i; - - if (ora_rs == NULL) - return 1; - - SB_LIST_FOR_EACH_SAFE(cur, next, &ora_rs->rows) - { - row = SB_LIST_ENTRY(cur, ora_row_t, listitem); - - if (row->data != NULL) - { - for (i = 0; i < ora_rs->ncolumns; i++) - { - if (row->data[i].value != NULL) - free(row->data[i].value); - } - free(row->data); - } - - SB_LIST_DELETE(cur); - free(row); - } - - SB_LIST_FOR_EACH_SAFE(cur, next, &ora_rs->columns) - { - column = SB_LIST_ENTRY(cur, ora_column_t, listitem); - - if (column->name != NULL) - free(column->name); - if (column->value != NULL) - free(column->value); - - SB_LIST_DELETE(cur); - free(column); - } - - free(ora_rs); - - rs->ptr = NULL; - - return 0; -} - - -/* Close prepared statement */ - - -int ora_drv_close(db_stmt_t *stmt) -{ - ora_stmt_t *ora_stmt = stmt->ptr; - - if (ora_stmt == NULL) - return 1; - OCIHandleFree(stmt, OCI_HTYPE_STMT); - - return 0; -} - - -/* Uninitialize driver */ - - -int ora_drv_done(void) -{ - sword rc; - - if (ora_env == NULL) - return 1; - - rc = OCIHandleFree(ora_env, OCI_HTYPE_ENV); - if (rc != OCI_SUCCESS) - { - log_text(LOG_FATAL, "OCIHandleFree failed"); - return 1; - } - - return 0; -} - - -/* Get Oracle type, type length and indicator values from sysbench parameter */ - -sword get_oracle_bind_type(db_bind_t *param, ub2 *type, sb4 *len, - sb2 *ind) -{ - unsigned int i; - - for (i = 0; db_oracle_bind_map[i].db_type != DB_TYPE_NONE; i++) - if (db_oracle_bind_map[i].db_type == param->type) - { - *type = db_oracle_bind_map[i].ora_type; - *len = db_oracle_bind_map[i].ora_len; - if (param->type == DB_TYPE_CHAR || param->type == DB_TYPE_VARCHAR) - *len = strlen(param->buffer); - *ind = (param->is_null) ? -1 : 0; - - return 0; - } - - return 1; -} - - -/* Get Oracle type size in bytes */ - - -sb4 get_oracle_type_size(sword type) -{ - unsigned int i; - sb4 size = 0; - - if (type == SQLT_NUM) - return 21; - - for (i = 0; db_oracle_bind_map[i].db_type != DB_TYPE_NONE; i++) - if (db_oracle_bind_map[i].ora_type == type && - size < db_oracle_bind_map[i].ora_len) - size = db_oracle_bind_map[i].ora_len; - - return size; -} - -ora_stmt_type_t get_stmt_type(const char *query) -{ - if (!strncmp(query, "BEGIN", 5)) - return STMT_TYPE_BEGIN; - else if (!strncmp(query, "COMMIT", 6)) - return STMT_TYPE_COMMIT; - else if (!strncmp(query, "SELECT", 6)) - return STMT_TYPE_SELECT; - - return STMT_TYPE_UPDATE; -} - -db_bind_type_t get_db_bind_type(sword type) -{ - unsigned int i; - - for (i = 0; db_oracle_bind_map[i].db_type != DB_TYPE_NONE; i++) - if (db_oracle_bind_map[i].ora_type == type) - return db_oracle_bind_map[i].db_type; - - return DB_TYPE_NONE; -} - - -/* Check and display Oracle error */ - - -void checkerr(OCIError *errhp, sword status) -{ - text errbuf[512]; - sword errcode; - - switch (status) - { - case OCI_SUCCESS: - break; - case OCI_SUCCESS_WITH_INFO: - log_text(LOG_ALERT, "Error - OCI_SUCCESS_WITH_INFO"); - break; - case OCI_NEED_DATA: - log_text(LOG_ALERT, "Error - OCI_NEED_DATA"); - break; - case OCI_NO_DATA: - log_text(LOG_ALERT, "Error - OCI_NO_DATA"); - break; - case OCI_ERROR: - OCIErrorGet((dvoid *) errhp, (ub4) 1, - (text *) NULL, (sb4 *) &errcode, - errbuf, (ub4) sizeof(errbuf), - (ub4) OCI_HTYPE_ERROR); - log_text(LOG_ALERT, "Error - %s", errbuf); - break; - case OCI_INVALID_HANDLE: - log_text(LOG_ALERT, "Error - OCI_INVALID_HANDLE"); - break; - case OCI_STILL_EXECUTING: - log_text(LOG_ALERT, "Error - OCI_STILL_EXECUTE"); - break; - case OCI_CONTINUE: - log_text(LOG_ALERT, "Error - OCI_CONTINUE"); - break; - default: - break; - } -} diff --git a/src/lua/oltp_common.lua b/src/lua/oltp_common.lua index a4199ac..b38cce8 100644 --- a/src/lua/oltp_common.lua +++ b/src/lua/oltp_common.lua @@ -161,8 +161,7 @@ function create_table(drv, con, table_num) id_index_def = "PRIMARY KEY" end - if drv:name() == "mysql" or drv:name() == "attachsql" or - drv:name() == "drizzle" + if drv:name() == "mysql" then if sysbench.opt.auto_inc then id_def = "INTEGER NOT NULL AUTO_INCREMENT"