--- sql/oracle/parser3oracle.C 2004/06/18 11:29:55 1.59 +++ sql/oracle/parser3oracle.C 2004/06/18 15:55:52 1.60 @@ -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.59 2004/06/18 11:29:55 paf Exp $"; +static const char *RCSId="$Id: parser3oracle.C,v 1.60 2004/06/18 15:55:52 paf Exp $"; #include "config_includes.h" @@ -129,7 +129,7 @@ struct Connection { } options; }; -struct OracleSQL_query_lobs { +struct Query_lobs { struct return_rows { struct return_row { OCILobLocator *locator; ub4 len; @@ -148,11 +148,13 @@ struct OracleSQL_query_lobs { } items[MAX_IN_LOBS]; int count; }; + #endif // forwards -void check(Connection& connection, const char *step, sword status); -void check(Connection& connection, bool error); +static void faile(Connection& connection, const char *msg); +static void check(Connection& connection, const char *step, sword status); +static void check(Connection& connection, bool error); static sb4 cbf_no_data( dvoid *ctxp, OCIBind *bindp, @@ -416,22 +418,24 @@ public: *to=0; return result; } - void query(void *aconnection, - const char *astatement, unsigned long offset, unsigned long limit, + void query(void* aconnection, + const char* astatement, + size_t placeholders_count, Placeholder* placeholders, + unsigned long offset, unsigned long limit, SQL_Driver_query_event_handlers& handlers) { Connection& connection=*static_cast(aconnection); const char* cstrClientCharset=connection.options.cstrClientCharset; - OracleSQL_query_lobs lobs={{0}, 0}; + Query_lobs lobs={{0}, 0}; OCIStmt *stmthp=0; SQL_Driver_services& services=*connection.services; // transcode from $request:charset to connect-string?client_charset if(cstrClientCharset) { - size_t transcoded_statement_size; + size_t transcoded_xxx_size; services.transcode(astatement, strlen(astatement), - astatement, transcoded_statement_size, + astatement, transcoded_xxx_size, services.request_charset(), cstrClientCharset); } @@ -449,9 +453,50 @@ public: OCIStmtPrepare(stmthp, connection.errhp, (unsigned char *)statement, (ub4)strlen((char *)statement), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT)); + + struct Bind_info { + OCIBind *bind; + sb2 indicator; + }; + + int binds_size=sizeof(Bind_info) * placeholders_count; + Bind_info* binds=static_cast(services.malloc_atomic(binds_size)); { + for(size_t i=0; icount; r++) { OCILobLocator *locator=rows->row[r].locator; check(connection, "lobwrite", OCILobWrite ( @@ -786,7 +863,14 @@ private: // private funcs for(int i=0; i(ctxp); + Query_lobs::Item& context=*static_cast(ctxp); if(index==0) { static ub4 rows; @@ -1107,11 +1198,11 @@ static sb4 cbf_get_data(dvoid *ctxp, (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.connection->services->malloc_atomic(sizeof(OracleSQL_query_lobs::return_rows::return_row)*rows); + context.rows.row=(Query_lobs::return_rows::return_row *) + context.connection->services->malloc_atomic(sizeof(Query_lobs::return_rows::return_row)*rows); } - OracleSQL_query_lobs::return_rows::return_row &var=context.rows.row[index]; + 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,