--- sql/oracle/parser3oracle.C 2003/01/21 15:51:29 1.29 +++ sql/oracle/parser3oracle.C 2003/10/30 12:38:18 1.40 @@ -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.29 2003/01/21 15:51:29 paf Exp $"; +static const char *RCSId="$Id: parser3oracle.C,v 1.40 2003/10/30 12:38:18 paf Exp $"; #include "config_includes.h" @@ -38,7 +38,7 @@ inline int max(int a, int b) { return a> inline int min(int a, int b){ return a "''" - *to++='\''; result++; - break; - } - *to++=*from++; + const char* quote( + SQL_Driver_services& services, void *connection, + const char *from, unsigned int length) { + char *result=(char*)services.malloc_atomic(length*2+1); + char *to=result; + while(length--) { + switch(*from) { + case '\'': // "'" -> "''" + *to++='\''; + break; } - return result; - } else // estimate mode - return length*2; + *to++=*from++; + } + *to=0; + return result; } void query( SQL_Driver_services& services, void *connection, @@ -455,7 +463,7 @@ private: // private funcs const char *astatement, OracleSQL_query_lobs &lobs) { size_t statement_size=strlen(astatement); - char *result=(char *)services.malloc(statement_size + char *result=(char *)services.malloc_atomic(statement_size +MAX_STRING // in case of short 'strings' +11/* returning */+6/* into */+(MAX_LOB_NAME_LENGTH+2/*:, */)*2/*ret into*/*MAX_IN_LOBS +1); @@ -468,6 +476,7 @@ private: // private funcs o[0]=='/' && o[1]=='*' && o[2]=='*') { // name start + const char* saved_o=o; o+=3; const char *name_begin=o; while(*o) @@ -476,11 +485,12 @@ private: // private funcs o[1]=='*' && o[2]=='/' && o[3]=='\'') { // name end + saved_o=0; // found, marking that const char *name_end=o; o+=4; OracleSQL_query_lobs::Item &item=lobs.items[lobs.count++]; item.name_ptr=name_begin; item.name_size=name_end-name_begin; - item.data_ptr=(char *)services.malloc(statement_size/*max*/); item.data_size=0; + item.data_ptr=(char *)services.malloc_atomic(statement_size/*max*/); item.data_size=0; const char *start=o; bool escaped=false; @@ -507,6 +517,10 @@ private: // private funcs break; } else o++; // /**skip**/'xxx' + if(saved_o) { + o=saved_o; + *n++=*o++; + } } else *n++=*o++; } @@ -619,7 +633,7 @@ private: // private funcs ub2 dtype; text *col_name; - struct { + struct Col { ub2 type; char *str; OCILobLocator *var; @@ -656,11 +670,16 @@ private: // private funcs (dvoid**) &col_name, (ub4 *) &col_name_len, (ub4)OCI_ATTR_NAME, (OCIError *)cs.errhp)); + Col& col=cols[column_count-1]; { - size_t size=(size_t)col_name_len; - char *ptr=(char *)services.malloc(size); - tolower(ptr, (char *)col_name, size); - check(cs, handlers.add_column(cs.sql_error, ptr, size)); + size_t length=(size_t)col_name_len; + char *ptr=(char *)services.malloc_atomic(length+1); + if( cs.bLowerCaseColumnNames ) + tolower(ptr, (char *)col_name, length); + else + memcpy(ptr, col_name, length); + ptr[length]=0; + check(cs, handlers.add_column(cs.sql_error, ptr, length)); } ub2 coerce_type=dtype; @@ -671,7 +690,7 @@ private: // private funcs case SQLT_CLOB: { check(cs, "alloc output var desc", OCIDescriptorAlloc( - (dvoid *)cs.envhp, (dvoid **)(ptr=&cols[column_count-1].var), + (dvoid *)cs.envhp, (dvoid **)(ptr=&col.var), (ub4)OCI_DTYPE_LOB, 0, (dvoid **)0)); @@ -680,17 +699,17 @@ private: // private funcs } default: coerce_type=SQLT_STR; - ptr=cols[column_count-1].str=(char *)services.malloc(MAX_OUT_STRING_LENGTH+1); + ptr=col.str=(char *)services.malloc_atomic(MAX_OUT_STRING_LENGTH+1); size=MAX_OUT_STRING_LENGTH; break; } - cols[column_count-1].type=coerce_type; + col.type=coerce_type; - check(cs, "DefineByPos", OCIDefineByPos( - stmthp, &cols[column_count-1].def, cs.errhp, + col.def=0; check(cs, "DefineByPos", OCIDefineByPos( + stmthp, &col.def, cs.errhp, column_count, (ub1 *) ptr, size, - coerce_type, (dvoid *) &cols[column_count-1].indicator, + coerce_type, (dvoid *) &col.indicator, (ub2 *)0, (ub2 *)0, OCI_DEFAULT)); } @@ -706,8 +725,8 @@ private: // private funcs if(row>=offset) { check(cs, handlers.add_row(cs.sql_error)); for(int i=0; ierrhp)) ; 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]; @@ -1018,6 +1038,5 @@ void tolower(char *out, const char *in, } extern "C" SQL_Driver *SQL_DRIVER_CREATE() { - //_asm int 3; return OracleSQL_driver=new OracleSQL_Driver(); }