mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Make possible to get ODBC DataSources name and description by:
create table datasrc ( `anyname` varchar(256) flag=1, `anyother name` varchar(256) flag=2) engine=CONNECT table_type=ODBC option_list='info=yes'; or simply by: create table datasrc engine=CONNECT table_type=ODBC option_list='info=yes'; then: select * from datasrc; Modified: ha_connect.cc odbconn.h odbconn.cpp tabodbc.h tabodbc.cpp
This commit is contained in:
@@ -3272,20 +3272,21 @@ bool ha_connect::add_fields(THD *thd, void *alt_info,
|
|||||||
bool ha_connect::pre_create(THD *thd, void *crt_info, void *alt_info)
|
bool ha_connect::pre_create(THD *thd, void *crt_info, void *alt_info)
|
||||||
{
|
{
|
||||||
char ttp= '?', spc= ',', qch= 0, *typn= "DOS";
|
char ttp= '?', spc= ',', qch= 0, *typn= "DOS";
|
||||||
char *fn, *dsn, *tab, *db, *host, *user, *pwd, *prt, *sep;
|
char *fn, *dsn, *tab, *db, *host, *user, *pwd, *prt, *sep, *inf;
|
||||||
#if defined(WIN32)
|
#if defined(WIN32)
|
||||||
char *nsp= NULL, *cls= NULL;
|
char *nsp= NULL, *cls= NULL;
|
||||||
#endif // WIN32
|
#endif // WIN32
|
||||||
int port= MYSQL_PORT, hdr= 0, mxr= 0;
|
int port= MYSQL_PORT, hdr= 0, mxr= 0;
|
||||||
bool ok= false;
|
bool b= false, ok= false, info= false;
|
||||||
LEX *lex= thd->lex;
|
LEX *lex= thd->lex;
|
||||||
|
LEX_STRING *comment, *name;
|
||||||
HA_CREATE_INFO *create_info= (HA_CREATE_INFO *)crt_info;
|
HA_CREATE_INFO *create_info= (HA_CREATE_INFO *)crt_info;
|
||||||
engine_option_value *pov;
|
engine_option_value *pov;
|
||||||
PQRYRES qrp;
|
PQRYRES qrp;
|
||||||
PCOLRES crp;
|
PCOLRES crp;
|
||||||
PGLOBAL g= GetPlug(thd);
|
PGLOBAL g= GetPlug(thd);
|
||||||
|
|
||||||
fn= dsn= tab= db= host= user= pwd= prt= sep= NULL;
|
fn= dsn= tab= db= host= user= pwd= prt= sep= inf= NULL;
|
||||||
|
|
||||||
if (g) {
|
if (g) {
|
||||||
// Set default values
|
// Set default values
|
||||||
@@ -3327,15 +3328,18 @@ bool ha_connect::pre_create(THD *thd, void *crt_info, void *alt_info)
|
|||||||
cls= GetListOption("class", pov->value.str);
|
cls= GetListOption("class", pov->value.str);
|
||||||
#endif // WIN32
|
#endif // WIN32
|
||||||
mxr= atoi(GetListOption("maxerr", pov->value.str, "0"));
|
mxr= atoi(GetListOption("maxerr", pov->value.str, "0"));
|
||||||
|
inf= GetListOption("info", pov->value.str);
|
||||||
} // endelse option_list
|
} // endelse option_list
|
||||||
|
|
||||||
switch (ttp) {
|
switch (ttp) {
|
||||||
#if defined(ODBC_SUPPORT)
|
#if defined(ODBC_SUPPORT)
|
||||||
case 'O': // ODBC
|
case 'O': // ODBC
|
||||||
if (!(dsn= create_info->connect_string.str))
|
info= !!strchr("1yYoO", *inf);
|
||||||
|
|
||||||
|
if (!(dsn= create_info->connect_string.str) && !info)
|
||||||
sprintf(g->Message, "Missing %s connection string", typn);
|
sprintf(g->Message, "Missing %s connection string", typn);
|
||||||
else
|
else
|
||||||
ok= true;
|
ok= !info;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
#endif // ODBC_SUPPORT
|
#endif // ODBC_SUPPORT
|
||||||
@@ -3367,8 +3371,6 @@ bool ha_connect::pre_create(THD *thd, void *crt_info, void *alt_info)
|
|||||||
if (ok) {
|
if (ok) {
|
||||||
char *length, *decimals, *cnm, *rem;
|
char *length, *decimals, *cnm, *rem;
|
||||||
int i, len, dec;
|
int i, len, dec;
|
||||||
bool b;
|
|
||||||
LEX_STRING *comment, *name;
|
|
||||||
enum_field_types type;
|
enum_field_types type;
|
||||||
PDBUSER dup= PlgGetUser(g);
|
PDBUSER dup= PlgGetUser(g);
|
||||||
PCATLG cat= (dup) ? dup->Catalog : NULL;
|
PCATLG cat= (dup) ? dup->Catalog : NULL;
|
||||||
@@ -3407,7 +3409,7 @@ bool ha_connect::pre_create(THD *thd, void *crt_info, void *alt_info)
|
|||||||
return true;
|
return true;
|
||||||
} // endif qrp
|
} // endif qrp
|
||||||
|
|
||||||
for (i= 0; i < qrp->Nblin; i++) {
|
for (i= 0; !b && i < qrp->Nblin; i++) {
|
||||||
crp= qrp->Colresp; // Column Name
|
crp= qrp->Colresp; // Column Name
|
||||||
cnm= encode(g, crp->Kdata->GetCharValue(i));
|
cnm= encode(g, crp->Kdata->GetCharValue(i));
|
||||||
name= thd->make_lex_string(NULL, cnm, strlen(cnm), true);
|
name= thd->make_lex_string(NULL, cnm, strlen(cnm), true);
|
||||||
@@ -3440,8 +3442,17 @@ bool ha_connect::pre_create(THD *thd, void *crt_info, void *alt_info)
|
|||||||
0, comment, NULL, NULL, NULL);
|
0, comment, NULL, NULL, NULL);
|
||||||
} // endfor i
|
} // endfor i
|
||||||
|
|
||||||
return false;
|
return b;
|
||||||
} // endif ttp
|
} else if (info) { // ODBC Data Sources
|
||||||
|
comment= thd->make_lex_string(NULL, "", 0, true);
|
||||||
|
name= thd->make_lex_string(NULL, "Name", 4, true);
|
||||||
|
b= add_fields(thd, alt_info, name, MYSQL_TYPE_VARCHAR, "256", 0,
|
||||||
|
0, comment, NULL, NULL, NULL);
|
||||||
|
name= thd->make_lex_string(NULL, "Description", 11, true);
|
||||||
|
b= add_fields(thd, alt_info, name, MYSQL_TYPE_VARCHAR, "256", 0,
|
||||||
|
0, comment, NULL, NULL, NULL);
|
||||||
|
return b;
|
||||||
|
} // endif info
|
||||||
|
|
||||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0, g->Message);
|
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0, g->Message);
|
||||||
return true;
|
return true;
|
||||||
|
@@ -189,7 +189,6 @@ CATPARM *AllocCatInfo(PGLOBAL g, CATINFO fid, char *tab, PQRYRES qrp)
|
|||||||
#if defined(_DEBUG)
|
#if defined(_DEBUG)
|
||||||
assert(qrp);
|
assert(qrp);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m = (size_t)qrp->Maxres;
|
m = (size_t)qrp->Maxres;
|
||||||
n = (size_t)qrp->Nbcol;
|
n = (size_t)qrp->Nbcol;
|
||||||
cap = (CATPARM *)PlugSubAlloc(g, NULL, sizeof(CATPARM));
|
cap = (CATPARM *)PlugSubAlloc(g, NULL, sizeof(CATPARM));
|
||||||
@@ -376,6 +375,50 @@ PQRYRES MyODBCCols(PGLOBAL g, char *tab, char *dsn)
|
|||||||
return qrp;
|
return qrp;
|
||||||
} // end of MyODBCCols
|
} // end of MyODBCCols
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
/* ODBCDataSources: constructs the result blocks containing all ODBC */
|
||||||
|
/* data sources available on the local host. */
|
||||||
|
/*************************************************************************/
|
||||||
|
PQRYRES ODBCDataSources(PGLOBAL g)
|
||||||
|
{
|
||||||
|
static int dbtype[] = {DB_CHAR, DB_CHAR};
|
||||||
|
static int buftyp[] = {TYPE_STRING, TYPE_STRING};
|
||||||
|
static unsigned int length[] = {0, 256};
|
||||||
|
int n, ncol = 2;
|
||||||
|
int maxres;
|
||||||
|
PQRYRES qrp;
|
||||||
|
ODBConn *ocp = new(g) ODBConn(g, NULL);
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* Do an evaluation of the result size. */
|
||||||
|
/************************************************************************/
|
||||||
|
maxres = 512; // This is completely arbitrary
|
||||||
|
n = ocp->GetMaxValue(SQL_MAX_DSN_LENGTH);
|
||||||
|
length[0] = (n) ? (n + 1) : 256;
|
||||||
|
|
||||||
|
#ifdef DEBTRACE
|
||||||
|
htrc("ODBCDataSources: max=%d len=%d\n", maxres, length[0]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* Allocate the structures used to refer to the result set. */
|
||||||
|
/************************************************************************/
|
||||||
|
qrp = PlgAllocResult(g, ncol, maxres, 0, dbtype, buftyp, length);
|
||||||
|
qrp->Colresp->Name = "Name";
|
||||||
|
qrp->Colresp->Next->Name = "Description";
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* Now get the results into blocks. */
|
||||||
|
/************************************************************************/
|
||||||
|
if (ocp->GetDataSources(qrp))
|
||||||
|
qrp = NULL;
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
/* Return the result pointer for use by GetData routines. */
|
||||||
|
/************************************************************************/
|
||||||
|
return qrp;
|
||||||
|
} // end of ODBCDataSources
|
||||||
|
|
||||||
#if 0 // Currently not used by CONNECT
|
#if 0 // Currently not used by CONNECT
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
/* ODBCTables: constructs the result blocks containing all tables in */
|
/* ODBCTables: constructs the result blocks containing all tables in */
|
||||||
@@ -1505,6 +1548,50 @@ bool ODBConn::BindParam(ODBCCOL *colp)
|
|||||||
return false;
|
return false;
|
||||||
} // end of BindParam
|
} // end of BindParam
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* Get the list of Data Sources and set it in qrp. */
|
||||||
|
/***********************************************************************/
|
||||||
|
bool ODBConn::GetDataSources(PQRYRES qrp)
|
||||||
|
{
|
||||||
|
UCHAR *dsn, *des;
|
||||||
|
UWORD dir = SQL_FETCH_FIRST;
|
||||||
|
SWORD n1, n2, p1, p2;
|
||||||
|
PCOLRES crp1 = qrp->Colresp, crp2 = qrp->Colresp->Next;
|
||||||
|
RETCODE rc;
|
||||||
|
|
||||||
|
n1 = crp1->Clen;
|
||||||
|
n2 = crp2->Clen;
|
||||||
|
|
||||||
|
try {
|
||||||
|
rc = SQLAllocEnv(&m_henv);
|
||||||
|
|
||||||
|
if (!Check(rc))
|
||||||
|
ThrowDBX(rc); // Fatal
|
||||||
|
|
||||||
|
for (int i = 0; i < qrp->Maxres; i++) {
|
||||||
|
dsn = (UCHAR*)crp1->Kdata->GetValPtr(i);
|
||||||
|
des = (UCHAR*)crp2->Kdata->GetValPtr(i);
|
||||||
|
rc = SQLDataSources(m_henv, dir, dsn, n1, &p1, des, n2, &p2);
|
||||||
|
|
||||||
|
if (rc == SQL_NO_DATA_FOUND)
|
||||||
|
break;
|
||||||
|
else if (!Check(rc))
|
||||||
|
ThrowDBX(rc); // Fatal
|
||||||
|
|
||||||
|
qrp->Nblin++;
|
||||||
|
dir = SQL_FETCH_NEXT;
|
||||||
|
} // endfor i
|
||||||
|
|
||||||
|
} catch(DBX *x) {
|
||||||
|
strcpy(m_G->Message, x->GetErrorMessage(0));
|
||||||
|
SQLFreeEnv(m_henv);
|
||||||
|
return true;
|
||||||
|
} // end try/catch
|
||||||
|
|
||||||
|
SQLFreeEnv(m_henv);
|
||||||
|
return false;
|
||||||
|
} // end of GetDataSources
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
/* Allocate recset and call SQLTables, SQLColumns or SQLPrimaryKeys. */
|
/* Allocate recset and call SQLTables, SQLColumns or SQLPrimaryKeys. */
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
|
@@ -143,6 +143,7 @@ class ODBConn : public BLOCK {
|
|||||||
bool ExecuteSQL(void);
|
bool ExecuteSQL(void);
|
||||||
bool BindParam(ODBCCOL *colp);
|
bool BindParam(ODBCCOL *colp);
|
||||||
int GetCatInfo(CATPARM *cap);
|
int GetCatInfo(CATPARM *cap);
|
||||||
|
bool GetDataSources(PQRYRES qrp);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Set special options
|
// Set special options
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
/************* Tabodbc C++ Program Source Code File (.CPP) *************/
|
/************* Tabodbc C++ Program Source Code File (.CPP) *************/
|
||||||
/* PROGRAM NAME: TABODBC */
|
/* PROGRAM NAME: TABODBC */
|
||||||
/* ------------- */
|
/* ------------- */
|
||||||
/* Version 2.3 */
|
/* Version 2.4 */
|
||||||
/* */
|
/* */
|
||||||
/* COPYRIGHT: */
|
/* COPYRIGHT: */
|
||||||
/* ---------- */
|
/* ---------- */
|
||||||
/* (C) Copyright to the author Olivier BERTRAND 2000-2012 */
|
/* (C) Copyright to the author Olivier BERTRAND 2000-2013 */
|
||||||
/* */
|
/* */
|
||||||
/* WHAT THIS PROGRAM DOES: */
|
/* WHAT THIS PROGRAM DOES: */
|
||||||
/* ----------------------- */
|
/* ----------------------- */
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
/* Include relevant MariaDB header file. */
|
/* Include relevant MariaDB header file. */
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
#include "my_global.h"
|
#include "my_global.h"
|
||||||
#if defined(WIN32)
|
#if defined(WIN32)
|
||||||
@@ -74,6 +74,7 @@
|
|||||||
|
|
||||||
#include "sql_string.h"
|
#include "sql_string.h"
|
||||||
|
|
||||||
|
PQRYRES ODBCDataSources(PGLOBAL g);
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
/* DB static variables. */
|
/* DB static variables. */
|
||||||
@@ -83,6 +84,16 @@ extern int num_read, num_there, num_eq[2]; // Statistics
|
|||||||
|
|
||||||
/* -------------------------- Class ODBCDEF -------------------------- */
|
/* -------------------------- Class ODBCDEF -------------------------- */
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* Constructor. */
|
||||||
|
/***********************************************************************/
|
||||||
|
ODBCDEF::ODBCDEF(void)
|
||||||
|
{
|
||||||
|
Connect = Tabname = Tabowner = Tabqual = Qchar = NULL;
|
||||||
|
Catver = Options = 0;
|
||||||
|
Info = false;
|
||||||
|
} // end of ODBCDEF constructor
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
/* DefineAM: define specific AM block values from XDB file. */
|
/* DefineAM: define specific AM block values from XDB file. */
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
@@ -102,6 +113,7 @@ bool ODBCDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff)
|
|||||||
Options = Cat->GetIntCatInfo(Name, "Options", dop);
|
Options = Cat->GetIntCatInfo(Name, "Options", dop);
|
||||||
//Options = Cat->GetIntCatInfo(Name, "Options", 0);
|
//Options = Cat->GetIntCatInfo(Name, "Options", 0);
|
||||||
Pseudo = 2; // FILID is Ok but not ROWID
|
Pseudo = 2; // FILID is Ok but not ROWID
|
||||||
|
Info = Cat->GetBoolCatInfo(Name, "Info", false);
|
||||||
return false;
|
return false;
|
||||||
} // end of DefineAM
|
} // end of DefineAM
|
||||||
|
|
||||||
@@ -116,12 +128,16 @@ PTDB ODBCDEF::GetTable(PGLOBAL g, MODE m)
|
|||||||
/* Allocate a TDB of the proper type. */
|
/* Allocate a TDB of the proper type. */
|
||||||
/* Column blocks will be allocated only when needed. */
|
/* Column blocks will be allocated only when needed. */
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
tdbp = new(g) TDBODBC(this);
|
if (!Info) {
|
||||||
|
tdbp = new(g) TDBODBC(this);
|
||||||
|
|
||||||
if (Multiple == 1)
|
if (Multiple == 1)
|
||||||
tdbp = new(g) TDBMUL(tdbp);
|
tdbp = new(g) TDBMUL(tdbp);
|
||||||
else if (Multiple == 2)
|
else if (Multiple == 2)
|
||||||
strcpy(g->Message, MSG(NO_ODBC_MUL));
|
strcpy(g->Message, MSG(NO_ODBC_MUL));
|
||||||
|
|
||||||
|
} else
|
||||||
|
tdbp = new(g) TDBOIF(this);
|
||||||
|
|
||||||
return tdbp;
|
return tdbp;
|
||||||
} // end of GetTable
|
} // end of GetTable
|
||||||
@@ -881,4 +897,183 @@ void ODBCCOL::WriteColumn(PGLOBAL g)
|
|||||||
|
|
||||||
} // end of WriteColumn
|
} // end of WriteColumn
|
||||||
|
|
||||||
|
/* ---------------------------TDBOIF class --------------------------- */
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* Implementation of the TDBOIF class. */
|
||||||
|
/***********************************************************************/
|
||||||
|
TDBOIF::TDBOIF(PODEF tdp) : TDBASE(tdp)
|
||||||
|
{
|
||||||
|
Qrp = NULL;
|
||||||
|
Init = false;
|
||||||
|
N = -1;
|
||||||
|
} // end of TDBOIF constructor
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* Allocate OIF column description block. */
|
||||||
|
/***********************************************************************/
|
||||||
|
PCOL TDBOIF::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n)
|
||||||
|
{
|
||||||
|
POIFCOL colp;
|
||||||
|
|
||||||
|
colp = (POIFCOL)new(g) OIFCOL(cdp, this, n);
|
||||||
|
|
||||||
|
if (cprec) {
|
||||||
|
colp->SetNext(cprec->GetNext());
|
||||||
|
cprec->SetNext(colp);
|
||||||
|
} else {
|
||||||
|
colp->SetNext(Columns);
|
||||||
|
Columns = colp;
|
||||||
|
} // endif cprec
|
||||||
|
|
||||||
|
if (!colp->Flag) {
|
||||||
|
if (!stricmp(colp->Name, "Name"))
|
||||||
|
colp->Flag = 1;
|
||||||
|
else if (!stricmp(colp->Name, "Description"))
|
||||||
|
colp->Flag = 2;
|
||||||
|
|
||||||
|
} // endif Flag
|
||||||
|
|
||||||
|
return colp;
|
||||||
|
} // end of MakeCol
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* Initialize: Get the list of ODBC data sources. */
|
||||||
|
/***********************************************************************/
|
||||||
|
bool TDBOIF::Initialize(PGLOBAL g)
|
||||||
|
{
|
||||||
|
if (Init)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!(Qrp = ODBCDataSources(g)))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
Init = true;
|
||||||
|
return false;
|
||||||
|
} // end of Initialize
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* OIF: Get the number of properties. */
|
||||||
|
/***********************************************************************/
|
||||||
|
int TDBOIF::GetMaxSize(PGLOBAL g)
|
||||||
|
{
|
||||||
|
if (MaxSize < 0) {
|
||||||
|
if (Initialize(g))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
MaxSize = Qrp->Nblin;
|
||||||
|
} // endif MaxSize
|
||||||
|
|
||||||
|
return MaxSize;
|
||||||
|
} // end of GetMaxSize
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* OIF Access Method opening routine. */
|
||||||
|
/***********************************************************************/
|
||||||
|
bool TDBOIF::OpenDB(PGLOBAL g)
|
||||||
|
{
|
||||||
|
if (Use == USE_OPEN) {
|
||||||
|
/*******************************************************************/
|
||||||
|
/* Table already open. */
|
||||||
|
/*******************************************************************/
|
||||||
|
N = -1;
|
||||||
|
return false;
|
||||||
|
} // endif use
|
||||||
|
|
||||||
|
if (Mode != MODE_READ) {
|
||||||
|
/*******************************************************************/
|
||||||
|
/* ODBC Info tables cannot be modified. */
|
||||||
|
/*******************************************************************/
|
||||||
|
strcpy(g->Message, "OIF tables are read only");
|
||||||
|
return true;
|
||||||
|
} // endif Mode
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
/* Initialize the ODBC processing. */
|
||||||
|
/*********************************************************************/
|
||||||
|
if (Initialize(g))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return InitCol(g);
|
||||||
|
} // end of OpenDB
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* Initialize columns. */
|
||||||
|
/***********************************************************************/
|
||||||
|
bool TDBOIF::InitCol(PGLOBAL g)
|
||||||
|
{
|
||||||
|
POIFCOL colp;
|
||||||
|
|
||||||
|
for (colp = (POIFCOL)Columns; colp; colp = (POIFCOL)colp->GetNext())
|
||||||
|
switch (colp->Flag) {
|
||||||
|
case 1:
|
||||||
|
colp->Crp = Qrp->Colresp;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
colp->Crp = Qrp->Colresp->Next;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
strcpy(g->Message, "Invalid column name or flag");
|
||||||
|
return true;
|
||||||
|
} // endswitch Flag
|
||||||
|
|
||||||
|
return false;
|
||||||
|
} // end of InitCol
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* Data Base read routine for OIF access method. */
|
||||||
|
/***********************************************************************/
|
||||||
|
int TDBOIF::ReadDB(PGLOBAL g)
|
||||||
|
{
|
||||||
|
return (++N < Qrp->Nblin) ? RC_OK : RC_EF;
|
||||||
|
} // end of ReadDB
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* WriteDB: Data Base write routine for OIF access methods. */
|
||||||
|
/***********************************************************************/
|
||||||
|
int TDBOIF::WriteDB(PGLOBAL g)
|
||||||
|
{
|
||||||
|
strcpy(g->Message, "OIF tables are read only");
|
||||||
|
return RC_FX;
|
||||||
|
} // end of WriteDB
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* Data Base delete line routine for OIF access methods. */
|
||||||
|
/***********************************************************************/
|
||||||
|
int TDBOIF::DeleteDB(PGLOBAL g, int irc)
|
||||||
|
{
|
||||||
|
strcpy(g->Message, "Delete not enabled for OIF tables");
|
||||||
|
return RC_FX;
|
||||||
|
} // end of DeleteDB
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* Data Base close routine for WMI access method. */
|
||||||
|
/***********************************************************************/
|
||||||
|
void TDBOIF::CloseDB(PGLOBAL g)
|
||||||
|
{
|
||||||
|
// Nothing to do
|
||||||
|
} // end of CloseDB
|
||||||
|
|
||||||
|
// ------------------------ OIFCOL functions ----------------------------
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* OIFCOL public constructor. */
|
||||||
|
/***********************************************************************/
|
||||||
|
OIFCOL::OIFCOL(PCOLDEF cdp, PTDB tdbp, int n)
|
||||||
|
: COLBLK(cdp, tdbp, n)
|
||||||
|
{
|
||||||
|
Tdbp = (PTDBOIF)tdbp;
|
||||||
|
Crp = NULL;
|
||||||
|
Flag = cdp->GetOffset();
|
||||||
|
} // end of WMICOL constructor
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* Read the next Data Source elements. */
|
||||||
|
/***********************************************************************/
|
||||||
|
void OIFCOL::ReadColumn(PGLOBAL g)
|
||||||
|
{
|
||||||
|
// Get the value of the Name or Description property
|
||||||
|
Value->SetValue_psz(Crp->Kdata->GetCharValue(Tdbp->N));
|
||||||
|
} // end of ReadColumn
|
||||||
|
|
||||||
/* ------------------------ End of Tabodbc --------------------------- */
|
/* ------------------------ End of Tabodbc --------------------------- */
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/*************** Tabodbc H Declares Source Code File (.H) **************/
|
/*************** Tabodbc H Declares Source Code File (.H) **************/
|
||||||
/* Name: TABODBC.H Version 1.4 */
|
/* Name: TABODBC.H Version 1.5 */
|
||||||
/* */
|
/* */
|
||||||
/* (C) Copyright to the author Olivier BERTRAND 2000-2012 */
|
/* (C) Copyright to the author Olivier BERTRAND 2000-2013 */
|
||||||
/* */
|
/* */
|
||||||
/* This file contains the TDBODBC classes declares. */
|
/* This file contains the TDBODBC classes declares. */
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
@@ -10,6 +10,8 @@
|
|||||||
typedef class ODBCDEF *PODEF;
|
typedef class ODBCDEF *PODEF;
|
||||||
typedef class TDBODBC *PTDBODBC;
|
typedef class TDBODBC *PTDBODBC;
|
||||||
typedef class ODBCCOL *PODBCCOL;
|
typedef class ODBCCOL *PODBCCOL;
|
||||||
|
typedef class TDBOIF *PTDBOIF;
|
||||||
|
typedef class OIFCOL *POIFCOL;
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
/* ODBC table. */
|
/* ODBC table. */
|
||||||
@@ -17,8 +19,7 @@ typedef class ODBCCOL *PODBCCOL;
|
|||||||
class DllExport ODBCDEF : public TABDEF { /* Logical table description */
|
class DllExport ODBCDEF : public TABDEF { /* Logical table description */
|
||||||
public:
|
public:
|
||||||
// Constructor
|
// Constructor
|
||||||
ODBCDEF(void)
|
ODBCDEF(void);
|
||||||
{Connect = Tabname = Tabowner = Tabqual = Qchar = NULL; Options = 0;}
|
|
||||||
|
|
||||||
// Implementation
|
// Implementation
|
||||||
virtual const char *GetType(void) {return "ODBC";}
|
virtual const char *GetType(void) {return "ODBC";}
|
||||||
@@ -43,6 +44,7 @@ class DllExport ODBCDEF : public TABDEF { /* Logical table description */
|
|||||||
PSZ Qchar; /* Identifier quoting character */
|
PSZ Qchar; /* Identifier quoting character */
|
||||||
int Catver; /* ODBC version for catalog functions */
|
int Catver; /* ODBC version for catalog functions */
|
||||||
int Options; /* Open connection options */
|
int Options; /* Open connection options */
|
||||||
|
bool Info; /* true if getting data sources */
|
||||||
}; // end of ODBCDEF
|
}; // end of ODBCDEF
|
||||||
|
|
||||||
#if !defined(NODBC)
|
#if !defined(NODBC)
|
||||||
@@ -158,5 +160,66 @@ class ODBCCOL : public COLBLK {
|
|||||||
SQLLEN Slen; // Used with Fetch
|
SQLLEN Slen; // Used with Fetch
|
||||||
int Rank; // Rank (position) number in the query
|
int Rank; // Rank (position) number in the query
|
||||||
}; // end of class ODBCCOL
|
}; // end of class ODBCCOL
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* This is the class declaration for the ODBC info table. */
|
||||||
|
/***********************************************************************/
|
||||||
|
class TDBOIF : public TDBASE {
|
||||||
|
friend class OIFCOL;
|
||||||
|
public:
|
||||||
|
// Constructor
|
||||||
|
TDBOIF(PODEF tdp);
|
||||||
|
|
||||||
|
// Implementation
|
||||||
|
virtual AMT GetAmType(void) {return TYPE_AM_ODBC;}
|
||||||
|
|
||||||
|
// Methods
|
||||||
|
virtual int GetRecpos(void) {return N;}
|
||||||
|
virtual int GetProgCur(void) {return N;}
|
||||||
|
virtual int RowNumber(PGLOBAL g, bool b = false) {return N + 1;}
|
||||||
|
|
||||||
|
// Database routines
|
||||||
|
virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n);
|
||||||
|
virtual int GetMaxSize(PGLOBAL g);
|
||||||
|
virtual bool OpenDB(PGLOBAL g);
|
||||||
|
virtual int ReadDB(PGLOBAL g);
|
||||||
|
virtual int WriteDB(PGLOBAL g);
|
||||||
|
virtual int DeleteDB(PGLOBAL g, int irc);
|
||||||
|
virtual void CloseDB(PGLOBAL g);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// Specific routines
|
||||||
|
bool Initialize(PGLOBAL g);
|
||||||
|
bool InitCol(PGLOBAL g);
|
||||||
|
|
||||||
|
// Members
|
||||||
|
PQRYRES Qrp;
|
||||||
|
int N; // Row number
|
||||||
|
bool Init;
|
||||||
|
}; // end of class TDBOIF
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/* Class OIFCOL: ODBC info column. */
|
||||||
|
/***********************************************************************/
|
||||||
|
class OIFCOL : public COLBLK {
|
||||||
|
friend class TDBOIF;
|
||||||
|
public:
|
||||||
|
// Constructors
|
||||||
|
OIFCOL(PCOLDEF cdp, PTDB tdbp, int n);
|
||||||
|
|
||||||
|
// Implementation
|
||||||
|
virtual int GetAmType(void) {return TYPE_AM_ODBC;}
|
||||||
|
|
||||||
|
// Methods
|
||||||
|
virtual void ReadColumn(PGLOBAL g);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
OIFCOL(void) {} // Default constructor not to be used
|
||||||
|
|
||||||
|
// Members
|
||||||
|
PTDBOIF Tdbp; // Points to ODBC table block
|
||||||
|
PCOLRES Crp; // The column data array
|
||||||
|
int Flag;
|
||||||
|
}; // end of class OIFCOL
|
||||||
#endif // !NODBC
|
#endif // !NODBC
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user