Commit c89b8a38 authored by Olivier Bertrand's avatar Olivier Bertrand

- Enhance the implementation of ODBC tables when using scrollable cursor

modified:
  storage/connect/odbconn.cpp
  storage/connect/odbconn.h
  storage/connect/tabodbc.cpp
parent 6211708a
...@@ -2439,29 +2439,31 @@ PQRYRES ODBConn::AllocateResult(PGLOBAL g) ...@@ -2439,29 +2439,31 @@ PQRYRES ODBConn::AllocateResult(PGLOBAL g)
/***********************************************************************/ /***********************************************************************/
/* Restart from beginning of result set */ /* Restart from beginning of result set */
/***********************************************************************/ /***********************************************************************/
bool ODBConn::Rewind(char *sql, ODBCCOL *tocols) int ODBConn::Rewind(char *sql, ODBCCOL *tocols)
{ {
RETCODE rc; int rc, rbuf = -1;
if (!m_hstmt) if (!m_hstmt)
return false; return rbuf;
if (m_Scrollable) { if (m_Scrollable) {
SQLULEN crow;
try { try {
rc = SQLFetchScroll(m_hstmt, SQL_FETCH_ABSOLUTE, 0); rc = SQLExtendedFetch(m_hstmt, SQL_FETCH_FIRST, 1, &crow, NULL);
if (rc != SQL_NO_DATA_FOUND) if (!Check(rc))
ThrowDBX(rc, "SQLFetchScroll", m_hstmt); ThrowDBX(rc, "SQLExtendedFetch", m_hstmt);
rbuf = (int)crow;
} catch(DBX *x) { } catch(DBX *x) {
strcpy(m_G->Message, x->GetErrorMessage(0)); strcpy(m_G->Message, x->GetErrorMessage(0));
return true;
} // end try/catch } // end try/catch
} else if (ExecDirectSQL(sql, tocols) < 0) } else if (ExecDirectSQL(sql, tocols) >= 0)
return true; rbuf = 0;
return false; return rbuf;
} // end of Rewind } // end of Rewind
/***********************************************************************/ /***********************************************************************/
......
...@@ -124,7 +124,7 @@ class ODBConn : public BLOCK { ...@@ -124,7 +124,7 @@ class ODBConn : public BLOCK {
forceOdbcDialog = 0x0010}; // Always display ODBC connect dialog forceOdbcDialog = 0x0010}; // Always display ODBC connect dialog
int Open(PSZ ConnectString, DWORD Options = 0); int Open(PSZ ConnectString, DWORD Options = 0);
bool Rewind(char *sql, ODBCCOL *tocols); int Rewind(char *sql, ODBCCOL *tocols);
void Close(void); void Close(void);
PQRYRES AllocateResult(PGLOBAL g); PQRYRES AllocateResult(PGLOBAL g);
......
...@@ -130,10 +130,7 @@ bool ODBCDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) ...@@ -130,10 +130,7 @@ bool ODBCDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff)
Quoted = GetIntCatInfo("Quoted", 0); Quoted = GetIntCatInfo("Quoted", 0);
Options = ODBConn::noOdbcDialog; Options = ODBConn::noOdbcDialog;
//Options = ODBConn::noOdbcDialog | ODBConn::useCursorLib; //Options = ODBConn::noOdbcDialog | ODBConn::useCursorLib;
Scrollable = GetBoolCatInfo("Scrollable", false);
if ((Scrollable = GetBoolCatInfo("Scrollable", false)))
Elemt = 0; // Not compatible with extended fetch
Memory = GetBoolCatInfo("Memory", false); Memory = GetBoolCatInfo("Memory", false);
Pseudo = 2; // FILID is Ok but not ROWID Pseudo = 2; // FILID is Ok but not ROWID
return false; return false;
...@@ -775,13 +772,14 @@ bool TDBODBC::OpenDB(PGLOBAL g) ...@@ -775,13 +772,14 @@ bool TDBODBC::OpenDB(PGLOBAL g)
if (Memory < 3) { if (Memory < 3) {
// Method will depend on cursor type // Method will depend on cursor type
if (Ocp->Rewind(Query, (PODBCCOL)Columns)) { if ((Rbuf = Ocp->Rewind(Query, (PODBCCOL)Columns)) < 0) {
Ocp->Close(); Ocp->Close();
return true; return true;
} // endif Rewind } // endif Rewind
} // endif Memory } // endif Memory
CurNum = 0;
Fpos = 0; Fpos = 0;
return false; return false;
} // endif use } // endif use
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment