--- sql/oracle/parser3oracle.C 2001/10/28 14:51:30 1.2 +++ sql/oracle/parser3oracle.C 2003/09/29 06:15:27 1.35 @@ -1,13 +1,13 @@ /** @file Parser Oracle driver. - Copyright(c) 2001 ArtLebedev Group(http://www.artlebedev.com) + Copyright(c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com) - Author: Alexander Petrosyan (http://design.ru/paf) + 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.2 2001/10/28 14:51:30 paf Exp $"; +static const char *RCSId="$Id: parser3oracle.C,v 1.35 2003/09/29 06:15:27 paf Exp $"; #include "config_includes.h" @@ -38,6 +38,54 @@ inline int max(int a, int b) { return a> inline int min(int a, int b){ return a "''" *to++='\''; break; - case '\\': // "\" -> "\\" - *to++='\''; - break; } *to++=*from++; } + *to=0; return result; } void query( @@ -309,18 +393,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, @@ -512,6 +608,18 @@ private: // private funcs OCIStmt *stmthp, unsigned long offset, unsigned long limit, SQL_Driver_query_event_handlers& handlers) { + ub4 prefetch_rows=100; + 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(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)); + OCIParam *mypard; ub2 dtype; text *col_name; @@ -535,27 +643,29 @@ private: // private funcs while(++column_count<=MAX_COLS) { /* get next descriptor, if there is one */ if(OCIParamGet(stmthp, OCI_HTYPE_STMT, cs.errhp, (void **)&mypard, - (ub4) column_count)!=OCI_SUCCESS) + (ub4) column_count)!=OCI_SUCCESS) { + --column_count; break; + } /* 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)); { size_t size=(size_t)col_name_len; - char *ptr=(char *)services.malloc(size); + char *ptr=(char *)services.malloc_atomic(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; @@ -565,7 +675,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)); @@ -575,39 +685,35 @@ private: // private funcs } default: coerce_type=SQLT_STR; - ptr=cols[column_count-1].str=(char *)services.malloc(MAX_OUT_STRING_LENGTH+1); + ptr=cols[column_count-1].str=(char *)services.malloc_atomic(MAX_OUT_STRING_LENGTH+1); size=MAX_OUT_STRING_LENGTH; break; } 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)) ; 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); + context.services->malloc_atomic(sizeof(OracleSQL_query_lobs::return_rows::return_row)*rows); } 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));