--- sql/odbc/parser3odbc.C 2002/03/05 15:04:59 1.6 +++ sql/odbc/parser3odbc.C 2002/05/15 10:21:46 1.8 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char *RCSId="$Id: parser3odbc.C,v 1.6 2002/03/05 15:04:59 paf Exp $"; +static const char *RCSId="$Id: parser3odbc.C,v 1.8 2002/05/15 10:21:46 paf Exp $"; #ifndef _MSC_VER # error compile ISAPI module with MSVC [no urge for now to make it autoconf-ed (PAF)] @@ -21,6 +21,19 @@ static const char *RCSId="$Id: parser3od #include #define MAX_STRING 0x400 +#define MAX_NUMBER 40 + +// MSSQL2000 +#ifndef SQL_NVARCHAR +#define SQL_NVARCHAR (-9) +#endif +#ifndef SQL_NTEXT +#define SQL_NTEXT (-10) +#endif +#ifndef SQL_SMALLDATETIME +#define SQL_SMALLDATETIME 11 +#endif +// create table test (id int, a smalldatetime, b ntext, c nvarchar(100)) #define snprintf _snprintf #ifndef strncasecmp @@ -135,7 +148,18 @@ public: statement++; TRY { - if(strncasecmp(statement, "select", 6)==0) { + // mk:@MSITStore:C:\Program%20Files\Microsoft%20SQL%20Server\80\Tools\Books\adosql.chm::/adoprg02_4g33.htm + // Server cursors are created only for statements that begin with: + // SELECT + // EXEC[ute] procedure_name + // call procedure_name + // mk:@MSITStore:C:\Program%20Files\Microsoft%20SQL%20Server\80\Tools\Books\odbcsql.chm::/od_6_035_5dnp.htm + // The ODBC CALL escape sequence for calling a procedure is: + // {[?=]call procedure_name[([parameter][,[parameter]]...)]} + if(strncasecmp(statement, "select", 6)==0 + || strncasecmp(statement, "EXEC", 4)==0 + || strncasecmp(statement, "call", 4)==0 + || strncasecmp(statement, "{", 1)==0) { CRecordset rs(db); rs.Open( CRecordset::forwardOnly, @@ -167,18 +191,28 @@ public: if(row>=offset) { handlers.add_row(); for(int i=0; iyear, + v.m_pdate->month, + v.m_pdate->day, + v.m_pdate->hour, + v.m_pdate->minute, + v.m_pdate->second, + v.m_pdate->fraction); + ptr=services.malloc(size); + memcpy(ptr, local_buf, size); + break; + } + default: + char msg[MAX_STRING]; + snprintf(msg, MAX_STRING, "unknown column return variant type (%d)", + v.m_dwType); + services._throw(msg); + } + } + + void getFromString(SQL_Driver_services& services, CString& s, void *& ptr, size_t& size) { + if(s.IsEmpty()) { + ptr=0; + size=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); + } + } + void _throw(SQL_Driver_services& services, CException *e) { char szCause[MAX_STRING]; szCause[0]=0; e->GetErrorMessage(szCause, MAX_STRING);