--- sql/odbc/parser3odbc.C 2003/01/21 15:51:29 1.13 +++ sql/odbc/parser3odbc.C 2003/11/19 12:57:43 1.17 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char *RCSId="$Id: parser3odbc.C,v 1.13 2003/01/21 15:51:29 paf Exp $"; +static const char *RCSId="$Id: parser3odbc.C,v 1.17 2003/11/19 12:57:43 paf Exp $"; #ifndef _MSC_VER # error compile ISAPI module with MSVC [no urge for now to make it autoconf-ed (PAF)] @@ -18,6 +18,7 @@ static const char *RCSId="$Id: parser3od #include "pa_sql_driver.h" +#define WINVER 0x0400 #include // defines @@ -126,20 +127,19 @@ public: return true; } - unsigned int quote( - SQL_Driver_services&, void *connection, - char *to, const char *from, unsigned int length) { - if(to) { // store mode - unsigned int result=length; - while(length--) { - if(*from=='\'') { // ' -> '' - *to++='\''; result++; - } - *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--) { + if(*from=='\'') { // ' -> '' + *to++='\''; } - return result; - } else // estimate mode - return length*2; + *to++=*from++; + } + *to=0; + return result; } void query( SQL_Driver_services& services, void *connection, @@ -201,12 +201,12 @@ public: rs.GetODBCFieldInfo(i, fieldinfo); column_types[i]=fieldinfo.m_nSQLType; size_t size=fieldinfo.m_strName.GetLength(); - void *ptr=0; + char *str=0; if(size) { - ptr=services.malloc(size); - memcpy(ptr, (char *)LPCTSTR(fieldinfo.m_strName), size); + str=(char*)services.malloc_atomic(size+1); + memcpy(str, (char *)LPCTSTR(fieldinfo.m_strName), size+1); } - CHECK(handlers.add_column(sql_error, ptr, size)); + CHECK(handlers.add_column(sql_error, str, size)); } CHECK(handlers.before_rows(sql_error)); @@ -219,24 +219,25 @@ public: CHECK(handlers.add_row(sql_error)); for(int i=0; im_dwDataLength) { + str=services.malloc_atomic(length+1); + memcpy(ptr, ::GlobalLock(v.m_pbinary->m_hData), length); + ::GlobalUnlock(v.m_pbinary->m_hData); + } else + str=0; + break; + }*/ case DBVT_NULL: // No union member is valid for access. - ptr=0; - size=0; + str=0; + length=0; break; /* case DBVT_BOOL: ptr=v.m_boolVal?"1":"0"; - size=1; + length=1; break;*/ /* case DBVT_UCHAR: - size=strlen(ptr=v.m_chVal); + length=strlen(ptr=v.m_chVal); break; case DBVT_SHORT: char buf[MAX_NUMBER]; - size=snprintf(HEAPIZE buf, "%d", v.m_iVal); + length=snprintf(HEAPIZE buf, "%d", v.m_iVal); break;*/ /* case DBVT_LONG: { char local_buf[MAX_NUMBER]; - size=snprintf(local_buf, MAX_NUMBER, "%ld", v.m_lVal); - ptr=services.malloc(size); - memcpy(ptr, local_buf, size); + length=snprintf(local_buf, MAX_NUMBER, "%ld", v.m_lVal); + ptr=services.malloc_atomic(length); + memcpy(ptr, local_buf, length); break; }*/ /*case DBVT_SINGLE: @@ -281,20 +293,10 @@ public: break; case DBVT_DOUBLE m_dblVal case DBVT_STRING m_pstring */ - case DBVT_BINARY: - { - if(size=v.m_pbinary->m_dwDataLength) { - ptr=services.malloc(size); - memcpy(ptr, ::GlobalLock(v.m_pbinary->m_hData), size); - ::GlobalUnlock(v.m_pbinary->m_hData); - } else - ptr=0; - break; - } case DBVT_DATE: { char local_buf[MAX_STRING]; - size=snprintf(local_buf, MAX_STRING, + length=snprintf(local_buf, MAX_STRING, "%04d-%02d-%02d %02d:%02d:%02d.%03d", v.m_pdate->year, v.m_pdate->month, @@ -303,8 +305,8 @@ public: v.m_pdate->minute, v.m_pdate->second, v.m_pdate->fraction); - ptr=services.malloc(size); - memcpy(ptr, local_buf, size); + str=(char*)services.malloc_atomic(length+1); + memcpy(str, local_buf, length+1); break; } default: @@ -315,15 +317,15 @@ public: } } - void getFromString(SQL_Driver_services& services, CString& s, void *& ptr, size_t& size) { + void getFromString(SQL_Driver_services& services, CString& s, char*& astr, size_t& length) { if(s.IsEmpty()) { - ptr=0; - size=0; + astr=0; + length=0; } else { const char *cstr=LPCTSTR(s); - size=strlen(cstr); //string.GetLength() works wrong with non-string types: - ptr=services.malloc(size); - memcpy(ptr, cstr, size); + length=strlen(cstr); //string.GetLength() works wrong with non-string types: + astr=(char*)services.malloc_atomic(length+1); + memcpy(astr, cstr, length+1); } }