--- sql/odbc/parser3odbc.C 2004/05/25 07:07:28 1.22 +++ sql/odbc/parser3odbc.C 2008/06/30 10:13:04 1.26.2.1 @@ -5,7 +5,7 @@ Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char *RCSId="$Id: parser3odbc.C,v 1.22 2004/05/25 07:07:28 paf Exp $"; +static const char *RCSId="$Id: parser3odbc.C,v 1.26.2.1 2008/06/30 10:13:04 misha Exp $"; #ifndef _MSC_VER # error compile ISAPI module with MSVC [no urge for now to make it autoconf-ed (PAF)] @@ -169,13 +169,18 @@ public: return result; } void query(void *aconnection, - const char *statement, unsigned long offset, unsigned long limit, + const char *statement, + size_t placeholders_count, Placeholder* placeholders, + unsigned long offset, unsigned long limit, SQL_Driver_query_event_handlers& handlers) { Connection& connection=*static_cast(aconnection); CDatabase *db=connection.db; SQL_Driver_services& services=*connection.services; + if(placeholders_count>0) + services._throw("bind variables not supported (yet)"); + // transcode from $request:charset to connect-string?client_charset if(const char* cstrClientCharset=connection.cstrClientCharset) { size_t transcoded_statement_size; @@ -185,7 +190,7 @@ public: cstrClientCharset); } - while(isspace(*statement)) + while(isspace((unsigned char)*statement)) statement++; TRY { @@ -204,10 +209,10 @@ public: CRecordset rs(db); TRY { rs.Open( - CRecordset::forwardOnly, + CRecordset::forwardOnly, statement, - CRecordset::executeDirect - ); + CRecordset::executeDirect|CRecordset::readOnly + ); } CATCH_ALL (e) { // could not fetch a table TRY { @@ -255,19 +260,27 @@ public: } CHECK(handlers.before_rows(sql_error)); + + // skip offset rows + if(offset){ + unsigned long row=offset; + while(!rs.IsEOF() && row>0){ + rs.MoveNext(); + row--; + } + } unsigned long row=0; CDBVariant v; CString s; - while(!rs.IsEOF() && (!limit||(row=offset) { - CHECK(handlers.add_row(sql_error)); - for(int i=0; ihour, v.m_pdate->minute, v.m_pdate->second, - v.m_pdate->fraction); + v.m_pdate->fraction/1000000); // lexical parser of INCOMING literal choked on times like hh:mm:ss.123000000 str=(char*)services.malloc_atomic(length+1); memcpy(str, local_buf, length+1); break; @@ -396,4 +409,4 @@ public: extern "C" SQL_Driver *SQL_DRIVER_CREATE() { return new ODBC_Driver(); -} \ No newline at end of file +}