--- parser3/src/sql/oracle/Attic/parser3oracle.C 2001/08/23 10:37:46 1.3 +++ parser3/src/sql/oracle/Attic/parser3oracle.C 2001/08/23 12:10:30 1.8 @@ -7,7 +7,7 @@ 2001.07.30 using Oracle 8.1.6, tested with Oracle 7.x.x */ -static const char *RCSId="$Id: parser3oracle.C,v 1.3 2001/08/23 10:37:46 parser Exp $"; +static const char *RCSId="$Id: parser3oracle.C,v 1.8 2001/08/23 12:10:30 parser Exp $"; #include "config_includes.h" @@ -118,17 +118,16 @@ public: int api_version() { return SQL_DRIVER_API_VERSION; } /// initialize driver by loading sql dynamic link library const char *initialize(const char *dlopen_file_spec) { -/* const char *error=dlopen_file_spec? + const char *error=dlopen_file_spec? dlink(dlopen_file_spec):"client library column is empty"; - if(!error) {*/ - OCIInitialize((ub4)OCI_THREADED | OCI_OBJECT, (dvoid *)0, - (dvoid * (*)(void *, unsigned int)) 0, - (dvoid * (*)(void*, void*, unsigned int)) 0, - (void (*)(void*, void*)) 0 ); - /*} + if(!error) { + OCIInitialize((ub4)OCI_THREADED, (dvoid *)0, + (dvoid * (*)(void *, unsigned int))0, + (dvoid * (*)(void*, void*, unsigned int))0, + (void (*)(void*, void*))0 ); + } - return error;*/ - return 0; + return error; } /** connect @@ -171,44 +170,44 @@ public: */ OCIHandleAlloc((dvoid *) NULL, (dvoid **) &cs.envhp, (ub4)OCI_HTYPE_ENV, 0, 0); // Initialize an environment handle, attempt #2 - check(services, cs, "OCIEnvInit", OCIEnvInit( + check(services, cs, "EnvInit", OCIEnvInit( &cs.envhp, (ub4)OCI_DEFAULT, 0, 0)); // Allocate and initialize OCIError handle - check(services, cs, "OCIHandleAlloc errhp", OCIHandleAlloc( + check(services, cs, "HandleAlloc errhp", OCIHandleAlloc( (dvoid *)cs.envhp, (dvoid **) &cs.errhp, (ub4)OCI_HTYPE_ERROR, 0, 0)); // Allocate and initialize OCIServer handle - check(services, cs, "OCIHandleAlloc srvhp", OCIHandleAlloc( + check(services, 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, "OCIServerAttach", OCIServerAttach( + check(services, cs, "ServerAttach", OCIServerAttach( cs.srvhp, cs.errhp, (text *) service, (sb4) strlen(service), (ub4)OCI_DEFAULT)); // Allocate and initialize OCISvcCtx handle - check(services, cs, "OCIHandleAlloc svchp", OCIHandleAlloc( + check(services, 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, "OCIAttrSet server-service", OCIAttrSet( + check(services, cs, "AttrSet server-service", OCIAttrSet( (dvoid *)cs.svchp, (ub4)OCI_HTYPE_SVCCTX, - (dvoid *)cs.srvhp, (ub4) 0, + (dvoid *)cs.srvhp, (ub4)0, (ub4)OCI_ATTR_SERVER, (OCIError *)cs.errhp)); // allocate a user context handle - check(services, cs, "OCIHandleAlloc usrhp", OCIHandleAlloc( + check(services, cs, "HandleAlloc usrhp", OCIHandleAlloc( (dvoid *)cs.envhp, (dvoid **)&cs.usrhp, (ub4)OCI_HTYPE_SESSION, 0, 0)); // set 'user' name - check(services, cs, "OCIAttrSet user-session", OCIAttrSet( + check(services, 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, "OCIAttrSet pwd-session", OCIAttrSet( + check(services, 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, "OCISessionBegin", OCISessionBegin( + check(services, cs, "SessionBegin", OCISessionBegin( cs.svchp, cs.errhp, cs.usrhp, OCI_CRED_RDBMS, OCI_DEFAULT)); // remember connection in session - check(services, cs, "OCIAttrSet service-session", OCIAttrSet( + check(services, cs, "AttrSet service-session", OCIAttrSet( (dvoid *)cs.svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid *)cs.usrhp, (ub4)0, OCI_ATTR_SESSION, cs.errhp)); @@ -218,36 +217,43 @@ public: } void disconnect(SQL_Driver_services& services, void *connection) { OracleSQL_connection_struct &cs=*(OracleSQL_connection_struct *)connection; + if(setjmp(cs.mark)) + services._throw(cs.error); // Terminate a user session - check(services, cs, "OCISessionEnd", OCISessionEnd( + check(services, cs, "SessionEnd", OCISessionEnd( cs.svchp, cs.errhp, cs.usrhp, (ub4)OCI_DEFAULT)); // Detach from a server; uninitialize server context handle - check(services, cs, "OCIServerDetach", OCIServerDetach( + check(services, cs, "ServerDetach", OCIServerDetach( cs.srvhp, cs.errhp, (ub4)OCI_DEFAULT)); // Free a previously allocated handle - check(services, cs, "OCIHandleFree srvhp", OCIHandleFree( + check(services, cs, "HandleFree srvhp", OCIHandleFree( (dvoid *)cs.srvhp, (ub4)OCI_HTYPE_SERVER)); - check(services, cs, "OCIHandleFree svchp", OCIHandleFree( + check(services, cs, "HandleFree svchp", OCIHandleFree( (dvoid *)cs.svchp, (ub4)OCI_HTYPE_SVCCTX)); - check(services, cs, "OCIHandleFree errhp", OCIHandleFree( + check(services, cs, "HandleFree errhp", OCIHandleFree( (dvoid *)cs.errhp, (ub4)OCI_HTYPE_ERROR)); cs.errhp=0; - check(services, cs, "OCIHandleFree envhp", OCIHandleFree( + check(services, cs, "HandleFree envhp", OCIHandleFree( (dvoid *)cs.envhp, (ub4)OCI_HTYPE_ENV)); } void commit(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, "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)); } bool ping(SQL_Driver_services&, void *connection) { - return false; + // maybe OCIServerVersion? + return true; } unsigned int quote( @@ -283,12 +289,11 @@ public: if(setjmp(cs.mark)) { failed=true; goto cleanup; - } - { + } else { const char *statement=preprocess_statement(services, cs, astatement, lobs); - check(services, cs, "OCIHandleAlloc STMT", OCIHandleAlloc( + check(services, cs, "HandleAlloc STMT", OCIHandleAlloc( (dvoid *)cs.envhp, (dvoid **) &stmthp, (ub4)OCI_HTYPE_STMT, 0, 0)); check(services, cs, "syntax", OCIStmtPrepare(stmthp, cs.errhp, (unsigned char *)statement, @@ -301,10 +306,10 @@ public: check(services, cs, "bind output", OCIBindByPos(stmthp, &lobs.items[i].bind, cs.errhp, - (ub4) 1+i, + (ub4)1+i, (dvoid *)&lobs.items[i].locator, - (sword)sizeof (lobs.items[i].locator), SQLT_CLOB, (dvoid *) 0, - (ub2 *) 0, (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DATA_AT_EXEC)); + (sword)sizeof (lobs.items[i].locator), SQLT_CLOB, (dvoid *)0, + (ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, OCI_DATA_AT_EXEC)); lobs.items[i].rows.count=0; OracleSQL_query_lobs::cbf_context_struct cbf_context={ @@ -324,17 +329,17 @@ cleanup: // no check call after this poi { for(int i=0; icount; r++) { /* free var locator */ - (void)OCIDescriptorFree((dvoid *) rows->row[r].locator, (ub4)OCI_DTYPE_LOB); + OCIDescriptorFree((dvoid *) rows->row[r].locator, (ub4)OCI_DTYPE_LOB); } } } if(stmthp) - (void)OCIHandleFree((dvoid *) stmthp, (ub4)OCI_HTYPE_STMT); + OCIHandleFree((dvoid *) stmthp, (ub4)OCI_HTYPE_STMT); if(failed) services._throw(cs.error); @@ -439,7 +444,7 @@ private: // private funcs //Zanyway, this is needed before. check(services, cs, "get stmt type", OCIAttrGet( (dvoid *)stmthp, (ub4)OCI_HTYPE_STMT, (ub1 *)&stmt_type, - (ub4 *) 0, OCI_ATTR_STMT_TYPE, cs.errhp)); + (ub4 *)0, OCI_ATTR_STMT_TYPE, cs.errhp)); */ if(strncasecmp(statement, "select", 6)==0) stmt_type=OCI_STMT_SELECT; @@ -448,8 +453,8 @@ private: // private funcs else if(strncasecmp(statement, "update", 6)==0) stmt_type=OCI_STMT_UPDATE; - int status=OCIStmtExecute(cs.svchp, stmthp, cs.errhp, - (ub4) stmt_type==OCI_STMT_SELECT?0:1, (ub4) 0, + sword status=OCIStmtExecute(cs.svchp, stmthp, cs.errhp, + (ub4) stmt_type==OCI_STMT_SELECT?0:1, (ub4)0, (OCISnapshot *) NULL, (OCISnapshot *) NULL, (ub4)OCI_DEFAULT); @@ -466,7 +471,7 @@ private: // private funcs cs.svchp, cs.errhp, locator, &bytes_to_write, 1, (dvoid *) lobs.items[i].data_ptr, (ub4)bytes_to_write, OCI_ONE_PIECE, - (dvoid *)0, 0, (ub2) 0, + (dvoid *)0, 0, (ub2)0, (ub1) SQLCS_IMPLICIT)); } } @@ -478,16 +483,11 @@ private: // private funcs stmthp, offset, limit, handlers); break; + default: + /* case OCI_STMT_INSERT: - break; - default:/* case OCI_STMT_UPDATE: - case OCI_STMT_DELETE: - case OCI_STMT_CREATE: - case OCI_STMT_DROP: - case OCI_STMT_ALTER: - case OCI_STMT_BEGIN: - case OCI_STMT_DECLARE:*/ + */ break; } } @@ -495,7 +495,7 @@ private: // private funcs void fetch_table(SQL_Driver_services& services, OracleSQL_connection_struct &cs, OCIStmt *stmthp, unsigned long offset, unsigned long limit, SQL_Driver_query_event_handlers& handlers) { - // todo another set/longjump + OCIParam *mypard; ub2 dtype; text *col_name; @@ -506,128 +506,253 @@ private: // private funcs OCILobLocator *var; OCIDefine *def; sb2 indicator; - } cols[MAX_COLS]; - int column_count; + } cols[MAX_COLS]={0}; + int column_count=0; - for(column_count=0; column_count=offset) { - handlers.add_row(); - for(int i=0; i=offset) { + handlers.add_row(); + for(int i=0; iOCIErrorGet((dvoid *)cs.errhp, (ub4)1, (text *) NULL, &errcode, + (text *) reason, (ub4) sizeof(reason), OCI_HTYPE_ERROR)==OCI_SUCCESS) + msg=reason; + else + msg="[can not get error description]"; break; } case OCI_SUCCESS_WITH_INFO: - msg="OCI_SUCCESS_WITH_INFO"; break; + msg="SUCCESS_WITH_INFO"; break; case OCI_NEED_DATA: - msg="OCI_NEED_DATA"; break; + msg="NEED_DATA"; break; case OCI_NO_DATA: - msg="OCI_NODATA"; break; + msg="NODATA"; break; case OCI_INVALID_HANDLE: - msg="OCI_INVALID_HANDLE"; break; + msg="INVALID_HANDLE"; break; case OCI_STILL_EXECUTING: - msg="OCI_STILL_EXECUTE"; break; + msg="STILL_EXECUTE"; break; case OCI_CONTINUE: - msg="OCI_CONTINUE"; break; - */ - } - if(!msg) { - sb4 errcode=0; - if(OCIErrorGet((dvoid *)cs.errhp, (ub4) 1, (text *) NULL, &errcode, - (text *) reason, (ub4) sizeof(reason), OCI_HTYPE_ERROR)==OCI_SUCCESS) - msg=reason; - else - msg="unknown error"; + msg="CONTINUE"; break; + default: + msg="unknown"; break; } snprintf(cs.error, sizeof(cs.error), "%s (%s, %d)", @@ -711,7 +842,7 @@ static sb4 cbf_no_data( ub4 *alenpp, ub1 *piecep, dvoid **indpp) { - *bufpp=(dvoid *) 0; + *bufpp=(dvoid *)0; *alenpp=0; static sb2 null_ind=-1; *indpp=(dvoid *) &null_ind; @@ -735,9 +866,11 @@ static sb4 cbf_get_data(dvoid *ctxp, *(OracleSQL_query_lobs::cbf_context_struct *)ctxp; if(index==0) { - static ub4 rows=0; - (void)OCIAttrGet((CONST dvoid *) bindp, OCI_HTYPE_BIND, (dvoid *)&rows, - (ub4 *)sizeof(ub2), OCI_ATTR_ROWS_RETURNED, context.cs->errhp); + static ub4 rows; + check(*context.services, *context.cs, "AttrGet cbf_get_data ROWS_RETURNED", + OracleSQL_driver->OCIAttrGet( + (CONST dvoid *) bindp, OCI_HTYPE_BIND, (dvoid *)&rows, + (ub4 *)sizeof(ub2), OCI_ATTR_ROWS_RETURNED, context.cs->errhp)) ; context.rows->count=(ub2)rows; context.rows->row=(OracleSQL_query_lobs::return_rows::return_row *) context.services->malloc(sizeof(OracleSQL_query_lobs::return_rows::return_row)*rows); @@ -745,10 +878,10 @@ 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", OCIDescriptorAlloc( + check(*context.services, *context.cs, "alloc output var desc dynamic", OracleSQL_driver->OCIDescriptorAlloc( (dvoid *) context.cs->envhp, (dvoid **)&var.locator, (ub4)OCI_DTYPE_LOB, - 0, (dvoid **) 0)); + 0, (dvoid **)0)); *bufpp=var.locator; *alenp=&var.len; @@ -765,5 +898,5 @@ void tolower(char *out, const char *in, } extern "C" SQL_Driver *create() { - return new OracleSQL_Driver(); + return OracleSQL_driver=new OracleSQL_Driver(); }