--- sql/odbc/parser3odbc.C 2008/07/08 10:53:32 1.36 +++ sql/odbc/parser3odbc.C 2015/10/26 16:00:50 1.41 @@ -1,11 +1,10 @@ /** @file Parser ODBC driver. - Copyright(c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001-2015 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char *RCSId="$Id: parser3odbc.C,v 1.36 2008/07/08 10:53:32 misha Exp $"; #ifndef _MSC_VER # error compile ISAPI module with MSVC [no urge for now to make it autoconf-ed (PAF)] @@ -21,6 +20,8 @@ static const char *RCSId="$Id: parser3od #define WINVER 0x0400 #include +volatile const char * IDENT_PARSER3ODBC_C="$Id: parser3odbc.C,v 1.41 2015/10/26 16:00:50 moko Exp $" IDENT_PA_SQL_DRIVER_H; + // defines #define MAX_COLS 500 @@ -210,16 +211,33 @@ public: return true; } - const char* quote(void *aconnection, const char *from, unsigned int length){ + // charset here is services.request_charset(), not connection.client_charset + // thus we can't use the sql server quoting support + const char* quote(void *aconnection, const char *str, unsigned int length) + { + const char* from; + const char* from_end=str+length; + + size_t quoted=0; + + for(from=str; from(aconnection); - char *result=(char*)connection.services->malloc_atomic(length*2+1); - char *to=result; - while(length--){ - if(*from=='\'') { // ' -> '' - *to++='\''; - } - *to++=*from++; + char *result=(char*)connection.services->malloc_atomic(length + quoted + 1); + char *to = result; + + for(from=str; from '' + *to++=*from; } + *to=0; return result; } @@ -514,7 +532,7 @@ private: result.limit=true; result.statement=statement_limited; - snprintf(statement_limited, MAX_NUMBER+11, "SELECT TOP %u", (limit)?limit+offset:0/*no point to skip anything if we need 0 rows*/); + snprintf(statement_limited, MAX_NUMBER+11, "SELECT TOP %lu", (limit)?limit+offset:0/*no point to skip anything if we need 0 rows*/); astatement+=6;/*skip 'select'*/ strcat(statement_limited, astatement); @@ -537,9 +555,9 @@ private: result.offset=true; result.statement=statement_limited; - statement_limited+=snprintf(statement_limited, MAX_NUMBER+15, "SELECT FIRST (%u)", limit); + statement_limited+=snprintf(statement_limited, MAX_NUMBER+15, "SELECT FIRST (%lu)", limit); if(offset && limit/*no reasons to skip something if we need 0 rows*/) - statement_limited+=snprintf(statement_limited, MAX_NUMBER+8, " SKIP (%u)", offset); + statement_limited+=snprintf(statement_limited, MAX_NUMBER+8, " SKIP (%lu)", offset); astatement+=6;/*skip 'select'*/ strcat((char*)result.statement, astatement); @@ -567,7 +585,7 @@ private: void _throw(Connection& connection, long value){ char msg[MAX_STRING]; - snprintf(msg, MAX_STRING, "%u", value); + snprintf(msg, MAX_STRING, "%lu", value); connection.services->_throw(msg); }