--- sql/oracle/parser3oracle.C 2004/03/04 09:10:13 1.52 +++ sql/oracle/parser3oracle.C 2004/05/19 09:32:50 1.57 @@ -7,7 +7,7 @@ 2001.07.30 using Oracle 8.1.6 [@test tested with Oracle 7.x.x] */ -static const char *RCSId="$Id: parser3oracle.C,v 1.52 2004/03/04 09:10:13 paf Exp $"; +static const char *RCSId="$Id: parser3oracle.C,v 1.57 2004/05/19 09:32:50 paf Exp $"; #include "config_includes.h" @@ -139,16 +139,13 @@ struct OracleSQL_query_lobs { } *row; int count; }; - struct cbf_context_struct { - Connection *connection; - return_rows *rows; - }; struct Item { const char *name_ptr; size_t name_size; char *data_ptr; size_t data_size; OCILobLocator *locator; OCIBind *bind; return_rows rows; + Connection *connection; } items[MAX_IN_LOBS]; int count; }; @@ -173,8 +170,8 @@ static sb4 cbf_get_data(dvoid *ctxp, ub1 *piecep, dvoid **indpp, ub2 **rcodepp); -static void tolower(char *out, const char *in, size_t size); -static void toupper(char *out, const char *in, size_t size); +static void tolower_str(char *out, const char *in, size_t size); +static void toupper_str(char *out, const char *in, size_t size); static const char *options2env(char *s, Connection::Options* options) { while(s) { @@ -183,7 +180,7 @@ static const char *options2env(char *s, if(char *value=lsplit(key, '=')) { if( strcmp( key, "ClientCharset" ) == 0 ) { if(options) { - toupper(value, value, strlen(value)); + toupper_str(value, value, strlen(value)); options->cstrClientCharset = value; } continue; @@ -262,8 +259,10 @@ public: char *used_only_in_connect_url, SQL_Driver_services& services, void **connection_ref ///< output: Connection * - ) { - Connection& connection=*(Connection *)services.malloc(sizeof(Connection)); + ) + { + // connections are cross-request, do not use services._alloc [linked with request] + Connection& connection=*(Connection *)::calloc(1, sizeof(Connection)); connection.services=&services; connection.options.bLowerCaseColumnNames = true; *connection_ref=&connection; @@ -420,18 +419,20 @@ public: SQL_Driver_query_event_handlers& handlers) { Connection& connection=*static_cast(aconnection); + const char* cstrClientCharset=connection.options.cstrClientCharset; OracleSQL_query_lobs lobs={{0}, 0}; OCIStmt *stmthp=0; SQL_Driver_services& services=*connection.services; // transcode from $request:charset to connect-string?client_charset - size_t transcoded_statement_size; - if(const char* cstrClientCharset=connection.options.cstrClientCharset) + if(cstrClientCharset) { + size_t transcoded_statement_size; services.transcode(astatement, strlen(astatement), astatement, transcoded_statement_size, services.request_charset(), cstrClientCharset); + } bool failed=false; if(setjmp(connection.mark)) { @@ -448,22 +449,23 @@ public: (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT)); { for(int i=0; i(ctxp); if(index==0) { static ub4 rows; @@ -1099,12 +1096,12 @@ static sb4 cbf_get_data(dvoid *ctxp, OracleSQL_driver->OCIAttrGet( (CONST dvoid *) bindp, OCI_HTYPE_BIND, (dvoid *)&rows, (ub4 *)sizeof(ub2), OCI_ATTR_ROWS_RETURNED, context.connection->errhp)) ; - context.rows->count=(ub2)rows; - context.rows->row=(OracleSQL_query_lobs::return_rows::return_row *) + context.rows.count=(ub2)rows; + context.rows.row=(OracleSQL_query_lobs::return_rows::return_row *) context.connection->services->malloc_atomic(sizeof(OracleSQL_query_lobs::return_rows::return_row)*rows); } - OracleSQL_query_lobs::return_rows::return_row &var=context.rows->row[index]; + OracleSQL_query_lobs::return_rows::return_row &var=context.rows.row[index]; check(*context.connection, "alloc output var desc dynamic", OracleSQL_driver->OCIDescriptorAlloc( (dvoid *) context.connection->envhp, (dvoid **)&var.locator, @@ -1120,11 +1117,11 @@ static sb4 cbf_get_data(dvoid *ctxp, return OCI_CONTINUE; } -static void tolower(char *out, const char *in, size_t size) { +static void tolower_str(char *out, const char *in, size_t size) { while(size--) *out++=(char)tolower(*in++); } -static void toupper(char *out, const char *in, size_t size) { +static void toupper_str(char *out, const char *in, size_t size) { while(size--) *out++=(char)toupper(*in++); }