--- sql/oracle/parser3oracle.C 2002/10/31 10:13:57 1.22 +++ sql/oracle/parser3oracle.C 2003/01/21 15:51:29 1.29 @@ -1,13 +1,13 @@ /** @file Parser Oracle driver. - Copyright(c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) + Copyright(c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) 2001.07.30 using Oracle 8.1.6 [@test tested with Oracle 7.x.x] */ -static const char *RCSId="$Id: parser3oracle.C,v 1.22 2002/10/31 10:13:57 paf Exp $"; +static const char *RCSId="$Id: parser3oracle.C,v 1.29 2003/01/21 15:51:29 paf Exp $"; #include "config_includes.h" @@ -68,18 +68,17 @@ static int pa_setenv(const char *name, c #else //#ifdef HAVE_SETENV if(value) { - char *buf; if(prev_value) { // MEM_LEAK_HERE - buf=(char *)::malloc(strlen(prev_value) + char *buf=(char *)::malloc(strlen(prev_value) +strlen(value) +1); strcpy(buf, prev_value); strcat(buf, value); - } else - buf=value; + value=buf; + } - return setenv(name, buf, 1/*overwrite*/); + return setenv(name, value, 1/*overwrite*/); } else { unsetenv(name); return 0; @@ -133,6 +132,7 @@ static const char *options2env(char *opt #ifndef DOXYGEN struct OracleSQL_connection_struct { jmp_buf mark; char error[MAX_STRING]; + SQL_Error sql_error; OCIEnv *envhp; OCIServer *srvhp; OCIError *errhp; @@ -166,9 +166,8 @@ struct OracleSQL_query_lobs { #endif // forwards -void check( - SQL_Driver_services& services, OracleSQL_connection_struct &cs, - const char *step, sword status); +void check(OracleSQL_connection_struct &cs, const char *step, sword status); +void check(OracleSQL_connection_struct &cs, bool error); static sb4 cbf_no_data( dvoid *ctxp, OCIBind *bindp, @@ -271,44 +270,44 @@ public: */ OCIHandleAlloc((dvoid *)NULL, (dvoid **) &cs.envhp, (ub4)OCI_HTYPE_ENV, 0, 0); // Initialize an environment handle, attempt #2 - check(services, cs, "EnvInit", OCIEnvInit( + check(cs, "EnvInit", OCIEnvInit( &cs.envhp, (ub4)OCI_DEFAULT, 0, 0)); // Allocate and initialize OCIError handle - check(services, cs, "HandleAlloc errhp", OCIHandleAlloc( + check(cs, "HandleAlloc errhp", OCIHandleAlloc( (dvoid *)cs.envhp, (dvoid **) &cs.errhp, (ub4)OCI_HTYPE_ERROR, 0, 0)); // Allocate and initialize OCIServer handle - check(services, cs, "HandleAlloc srvhp", OCIHandleAlloc( + check(cs, "HandleAlloc srvhp", OCIHandleAlloc( (dvoid *)cs.envhp, (dvoid **) &cs.srvhp, (ub4)OCI_HTYPE_SERVER, 0, 0)); // Attach to a 'service'; initialize server context handle - check(services, cs, "ServerAttach", OCIServerAttach( + check(cs, "ServerAttach", OCIServerAttach( cs.srvhp, cs.errhp, (text *)service, (sb4)strlen(service), (ub4)OCI_DEFAULT)); // Allocate and initialize OCISvcCtx handle - check(services, cs, "HandleAlloc svchp", OCIHandleAlloc( + check(cs, "HandleAlloc svchp", OCIHandleAlloc( (dvoid *)cs.envhp, (dvoid **) &cs.svchp, (ub4)OCI_HTYPE_SVCCTX, 0, 0)); // set attribute server context in the service context - check(services, cs, "AttrSet server-service", OCIAttrSet( + check(cs, "AttrSet server-service", OCIAttrSet( (dvoid *)cs.svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid *)cs.srvhp, (ub4)0, (ub4)OCI_ATTR_SERVER, (OCIError *)cs.errhp)); // allocate a user context handle - check(services, cs, "HandleAlloc usrhp", OCIHandleAlloc( + check(cs, "HandleAlloc usrhp", OCIHandleAlloc( (dvoid *)cs.envhp, (dvoid **)&cs.usrhp, (ub4)OCI_HTYPE_SESSION, 0, 0)); // set 'user' name - check(services, cs, "AttrSet user-session", OCIAttrSet( + check(cs, "AttrSet user-session", OCIAttrSet( (dvoid *)cs.usrhp, (ub4)OCI_HTYPE_SESSION, (dvoid *)user, (ub4)strlen(user), OCI_ATTR_USERNAME, cs.errhp)); // set 'pwd' password - check(services, cs, "AttrSet pwd-session", OCIAttrSet( + check(cs, "AttrSet pwd-session", OCIAttrSet( (dvoid *)cs.usrhp, (ub4)OCI_HTYPE_SESSION, (dvoid *)pwd, (ub4)strlen(pwd), OCI_ATTR_PASSWORD, cs.errhp)); // Authenticate a user - check(services, cs, "SessionBegin", OCISessionBegin( + check(cs, "SessionBegin", OCISessionBegin( cs.svchp, cs.errhp, cs.usrhp, OCI_CRED_RDBMS, OCI_DEFAULT)); // remember connection in session - check(services, cs, "AttrSet service-session", OCIAttrSet( + check(cs, "AttrSet service-session", OCIAttrSet( (dvoid *)cs.svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid *)cs.usrhp, (ub4)0, OCI_ATTR_SESSION, cs.errhp)); @@ -345,14 +344,14 @@ public: if(setjmp(cs.mark)) services._throw(cs.error); - check(services, cs, "commit", OCITransCommit(cs.svchp, cs.errhp, 0)); + check(cs, "commit", OCITransCommit(cs.svchp, cs.errhp, 0)); } void rollback(SQL_Driver_services& services, void *connection) { OracleSQL_connection_struct &cs=*(OracleSQL_connection_struct *)connection; if(setjmp(cs.mark)) services._throw(cs.error); - check(services, cs, "rollback", OCITransRollback(cs.svchp, cs.errhp, 0)); + check(cs, "rollback", OCITransRollback(cs.svchp, cs.errhp, 0)); } bool ping(SQL_Driver_services&, void *connection) { @@ -395,18 +394,18 @@ public: const char *statement=preprocess_statement(services, cs, astatement, lobs); - check(services, cs, "HandleAlloc STMT", OCIHandleAlloc( + check(cs, "HandleAlloc STMT", OCIHandleAlloc( (dvoid *)cs.envhp, (dvoid **) &stmthp, (ub4)OCI_HTYPE_STMT, 0, 0)); - check(services, cs, "syntax", + check(cs, "syntax", OCIStmtPrepare(stmthp, cs.errhp, (unsigned char *)statement, (ub4)strlen((char *)statement), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT)); { for(int i=0; icount; r++) { OCILobLocator *locator=rows->row[r].locator; - check(services, cs, "lobwrite", OCILobWrite ( + check(cs, "lobwrite", OCILobWrite ( cs.svchp, cs.errhp, locator, &bytes_to_write, 1, (dvoid *)lobs.items[i].data_ptr, (ub4)bytes_to_write, OCI_ONE_PIECE, @@ -602,13 +604,13 @@ private: // private funcs SQL_Driver_query_event_handlers& handlers) { ub4 prefetch_rows=100; - check(services, cs, "AttrSet prefetch-rows", OCIAttrSet( + check(cs, "AttrSet prefetch-rows", OCIAttrSet( (dvoid *)stmthp, (ub4)OCI_HTYPE_STMT, (dvoid *)&prefetch_rows, (ub4)0, (ub4)OCI_ATTR_PREFETCH_ROWS, (OCIError *)cs.errhp)); ub4 prefetch_mem_size=100*0x400; - check(services, cs, "AttrSet prefetch-memory", OCIAttrSet( + check(cs, "AttrSet prefetch-memory", OCIAttrSet( (dvoid *)stmthp, (ub4)OCI_HTYPE_STMT, (dvoid *)&prefetch_mem_size, (ub4)0, (ub4)OCI_ATTR_PREFETCH_MEMORY, (OCIError *)cs.errhp)); @@ -642,14 +644,14 @@ private: // private funcs } /* Retrieve the data type attribute */ - check(services, cs, "get type", OCIAttrGet( + check(cs, "get type", OCIAttrGet( (dvoid*) mypard, (ub4)OCI_DTYPE_PARAM, (dvoid*) &dtype, (ub4 *)0, (ub4)OCI_ATTR_DATA_TYPE, (OCIError *)cs.errhp)); /* Retrieve the column name attribute */ ub4 col_name_len; - check(services, cs, "get name", OCIAttrGet( + check(cs, "get name", OCIAttrGet( (dvoid*) mypard, (ub4)OCI_DTYPE_PARAM, (dvoid**) &col_name, (ub4 *) &col_name_len, (ub4)OCI_ATTR_NAME, (OCIError *)cs.errhp)); @@ -658,7 +660,7 @@ private: // private funcs size_t size=(size_t)col_name_len; char *ptr=(char *)services.malloc(size); tolower(ptr, (char *)col_name, size); - handlers.add_column(ptr, size); + check(cs, handlers.add_column(cs.sql_error, ptr, size)); } ub2 coerce_type=dtype; @@ -668,7 +670,7 @@ private: // private funcs switch(dtype) { case SQLT_CLOB: { - check(services, cs, "alloc output var desc", OCIDescriptorAlloc( + check(cs, "alloc output var desc", OCIDescriptorAlloc( (dvoid *)cs.envhp, (dvoid **)(ptr=&cols[column_count-1].var), (ub4)OCI_DTYPE_LOB, 0, (dvoid **)0)); @@ -685,24 +687,24 @@ private: // private funcs cols[column_count-1].type=coerce_type; - check(services, cs, "DefineByPos", OCIDefineByPos( + check(cs, "DefineByPos", OCIDefineByPos( stmthp, &cols[column_count-1].def, cs.errhp, column_count, (ub1 *) ptr, size, coerce_type, (dvoid *) &cols[column_count-1].indicator, (ub2 *)0, (ub2 *)0, OCI_DEFAULT)); } - handlers.before_rows(); + check(cs, handlers.before_rows(cs.sql_error)); for(unsigned long row=0; !limit||row=offset) { - handlers.add_row(); + check(cs, handlers.add_row(cs.sql_error)); for(int i=0; iOCIAttrGet( (CONST dvoid *) bindp, OCI_HTYPE_BIND, (dvoid *)&rows, (ub4 *)sizeof(ub2), OCI_ATTR_ROWS_RETURNED, context.cs->errhp)) ; @@ -1003,7 +998,7 @@ static sb4 cbf_get_data(dvoid *ctxp, OracleSQL_query_lobs::return_rows::return_row &var=context.rows->row[index]; - check(*context.services, *context.cs, "alloc output var desc dynamic", OracleSQL_driver->OCIDescriptorAlloc( + check(*context.cs, "alloc output var desc dynamic", OracleSQL_driver->OCIDescriptorAlloc( (dvoid *) context.cs->envhp, (dvoid **)&var.locator, (ub4)OCI_DTYPE_LOB, 0, (dvoid **)0));