diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 1453c418025..ae8f7f0efa8 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -1326,6 +1326,7 @@ void *ha_connect::GetColumnOption(PGLOBAL g, void *field, PCOLINFO pcf) datm.tm_mday= 12; datm.tm_mon= 11; datm.tm_year= 112; + mktime(&datm); // set other fields get proper day name len= strftime(buf, 256, pdtp->OutFmt, &datm); } else len= 0; diff --git a/storage/connect/odbconn.cpp b/storage/connect/odbconn.cpp index b68b4648616..e614980a57a 100644 --- a/storage/connect/odbconn.cpp +++ b/storage/connect/odbconn.cpp @@ -2439,29 +2439,31 @@ PQRYRES ODBConn::AllocateResult(PGLOBAL g) /***********************************************************************/ /* 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) - return false; + return rbuf; if (m_Scrollable) { + SQLULEN crow; + 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) - ThrowDBX(rc, "SQLFetchScroll", m_hstmt); + if (!Check(rc)) + ThrowDBX(rc, "SQLExtendedFetch", m_hstmt); + rbuf = (int)crow; } catch(DBX *x) { strcpy(m_G->Message, x->GetErrorMessage(0)); - return true; } // end try/catch - } else if (ExecDirectSQL(sql, tocols) < 0) - return true; + } else if (ExecDirectSQL(sql, tocols) >= 0) + rbuf = 0; - return false; + return rbuf; } // end of Rewind /***********************************************************************/ diff --git a/storage/connect/odbconn.h b/storage/connect/odbconn.h index 13d58488b39..ff8357c4591 100644 --- a/storage/connect/odbconn.h +++ b/storage/connect/odbconn.h @@ -124,7 +124,7 @@ class ODBConn : public BLOCK { forceOdbcDialog = 0x0010}; // Always display ODBC connect dialog int Open(PSZ ConnectString, DWORD Options = 0); - bool Rewind(char *sql, ODBCCOL *tocols); + int Rewind(char *sql, ODBCCOL *tocols); void Close(void); PQRYRES AllocateResult(PGLOBAL g); diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index cb21f33c1b1..6608083f1b4 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -130,10 +130,7 @@ bool ODBCDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Quoted = GetIntCatInfo("Quoted", 0); Options = ODBConn::noOdbcDialog; //Options = ODBConn::noOdbcDialog | ODBConn::useCursorLib; - - if ((Scrollable = GetBoolCatInfo("Scrollable", false))) - Elemt = 0; // Not compatible with extended fetch - + Scrollable = GetBoolCatInfo("Scrollable", false); Memory = GetBoolCatInfo("Memory", false); Pseudo = 2; // FILID is Ok but not ROWID return false; @@ -775,13 +772,14 @@ bool TDBODBC::OpenDB(PGLOBAL g) if (Memory < 3) { // Method will depend on cursor type - if (Ocp->Rewind(Query, (PODBCCOL)Columns)) { + if ((Rbuf = Ocp->Rewind(Query, (PODBCCOL)Columns)) < 0) { Ocp->Close(); return true; } // endif Rewind } // endif Memory + CurNum = 0; Fpos = 0; return false; } // endif use diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index 81d00862703..7227e637a14 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -2187,10 +2187,11 @@ static void TIME_to_localtime(struct tm *tm, const MYSQL_TIME *ltime) tm->tm_year= ltime->year - 1900; tm->tm_mon= ltime->month - 1; tm->tm_mday= ltime->day; + mktime(tm); // set tm->tm_wday tm->yday fields to get proper day name (OB) tm->tm_hour= ltime->hour; tm->tm_min= ltime->minute; tm->tm_sec= ltime->second; -} +} // end of TIME_to_localtime // Added by Alexander Barkov static struct tm *gmtime_mysql(const time_t *timep, struct tm *tm) @@ -2199,7 +2200,7 @@ static struct tm *gmtime_mysql(const time_t *timep, struct tm *tm) thd_gmt_sec_to_TIME(current_thd, <ime, (my_time_t) *timep); TIME_to_localtime(tm, <ime); return tm; -} +} // end of gmtime_mysql /***********************************************************************/ /* GetGmTime: returns a pointer to a static tm structure obtained */ @@ -2511,6 +2512,8 @@ char *DTVAL::ShowValue(char *buf, int len) if (!Null) { size_t m, n = 0; struct tm tm, *ptm = GetGmTime(&tm); + + if (Len < len) { p = buf; @@ -2596,7 +2599,7 @@ bool DTVAL::WeekNum(PGLOBAL g, int& nval) /***********************************************************************/ bool DTVAL::FormatValue(PVAL vp, char *fmt) { - char *buf = (char*)vp->GetTo_Val(); // Should be big enough + char *buf = (char*)vp->GetTo_Val(); // Should be big enough struct tm tm, *ptm = GetGmTime(&tm); if (trace > 1)