mirror of
https://github.com/MariaDB/server.git
synced 2026-10-23 18:49:29 +03:00
- Fix and error causing remote indexing to fail when for not unique index.
Was experienced with MYSQL, ODBC and JDBC tables. modified: storage/connect/connect.cc - Fix MDEV-9966 (zero lines returned) modified: storage/connect/ha_connect.cc modified: storage/federatedx/ha_federatedx.cc - Typo modified: storage/connect/odbconn.cpp modified: storage/connect/reldef.cpp modified: storage/connect/tabmysql.cpp - Add new table type JDBC modified: storage/connect/ha_connect.cc modified: storage/connect/mycat.cc modified: storage/connect/plgdbsem.h modified: storage/connect/plgdbutl.cpp modified: storage/connect/tabodbc.cpp added: storage/connect/jdbccat.h added: storage/connect/jdbconn.cpp added: storage/connect/jdbconn.h added: storage/connect/tabjdbc.cpp added: storage/connect/tabjdbc.h
This commit is contained in:
@@ -752,7 +752,7 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op,
|
||||
return RC_FX;
|
||||
} else if (x == 2) {
|
||||
// Remote index
|
||||
if (ptdb->ReadKey(g, op, kr))
|
||||
if (op != OP_SAME && ptdb->ReadKey(g, op, kr))
|
||||
return RC_FX;
|
||||
|
||||
goto rnd;
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
based on external data. Principally they are based on plain files of many
|
||||
different types, but also on collections of such files, collection of tables,
|
||||
local or remote MySQL/MariaDB tables retrieved via MySQL API,
|
||||
ODBC tables retrieving data from other DBMS having an ODBC server, and even
|
||||
virtual tables.
|
||||
ODBC/JDBC tables retrieving data from other DBMS having an ODBC/JDBC server,
|
||||
and even virtual tables.
|
||||
|
||||
@details
|
||||
ha_connect will let you create/open/delete tables, the created table can be
|
||||
@@ -115,9 +115,6 @@
|
||||
#include "sql_parse.h"
|
||||
#include "sql_base.h"
|
||||
#include <sys/stat.h>
|
||||
#if defined(NEW_WAY)
|
||||
#include "sql_table.h"
|
||||
#endif // NEW_WAY
|
||||
#include "sql_partition.h"
|
||||
#undef OFFSET
|
||||
|
||||
@@ -130,6 +127,9 @@
|
||||
#if defined(ODBC_SUPPORT)
|
||||
#include "odbccat.h"
|
||||
#endif // ODBC_SUPPORT
|
||||
#if defined(JDBC_SUPPORT)
|
||||
#include "jdbccat.h"
|
||||
#endif // JDBC_SUPPORT
|
||||
#include "xtable.h"
|
||||
#include "tabmysql.h"
|
||||
#include "filamdbf.h"
|
||||
@@ -197,6 +197,7 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info);
|
||||
PQRYRES VirColumns(PGLOBAL g, bool info);
|
||||
PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info);
|
||||
PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info);
|
||||
int TranslateJDBCType(int stp, int prec, int& len, char& v);
|
||||
void PushWarning(PGLOBAL g, THD *thd, int level);
|
||||
bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host,
|
||||
const char *db, char *tab, const char *src, int port);
|
||||
@@ -1758,9 +1759,10 @@ int ha_connect::OpenTable(PGLOBAL g, bool del)
|
||||
break;
|
||||
} // endswitch xmode
|
||||
|
||||
if (xmod != MODE_INSERT || tdbp->GetAmType() == TYPE_AM_ODBC
|
||||
|| tdbp->GetAmType() == TYPE_AM_MYSQL) {
|
||||
// Get the list of used fields (columns)
|
||||
if (xmod != MODE_INSERT || tdbp->GetAmType() == TYPE_AM_MYSQL
|
||||
|| tdbp->GetAmType() == TYPE_AM_ODBC
|
||||
|| tdbp->GetAmType() == TYPE_AM_JDBC) {
|
||||
// Get the list of used fields (columns)
|
||||
char *p;
|
||||
unsigned int k1, k2, n1, n2;
|
||||
Field* *field;
|
||||
@@ -2077,8 +2079,9 @@ int ha_connect::ScanRecord(PGLOBAL g, uchar *)
|
||||
continue; // Is a virtual column possible here ???
|
||||
|
||||
if ((xmod == MODE_INSERT && tdbp->GetAmType() != TYPE_AM_MYSQL
|
||||
&& tdbp->GetAmType() != TYPE_AM_ODBC) ||
|
||||
bitmap_is_set(table->write_set, fp->field_index)) {
|
||||
&& tdbp->GetAmType() != TYPE_AM_ODBC
|
||||
&& tdbp->GetAmType() != TYPE_AM_JDBC) ||
|
||||
bitmap_is_set(table->write_set, fp->field_index)) {
|
||||
for (colp= tp->GetSetCols(); colp; colp= colp->GetNext())
|
||||
if (!stricmp(colp->GetName(), fp->field_name))
|
||||
break;
|
||||
@@ -2288,7 +2291,7 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q,
|
||||
op= OP_EQ;
|
||||
break;
|
||||
case HA_READ_AFTER_KEY:
|
||||
op= (stlen >= len) ? (!i ? OP_GT : OP_LE) : OP_GE;
|
||||
op= (stlen >= len || i > 0) ? (i > 0 ? OP_LE : OP_GT) : OP_GE;
|
||||
break;
|
||||
case HA_READ_KEY_OR_NEXT:
|
||||
op= OP_GE;
|
||||
@@ -2627,7 +2630,7 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond)
|
||||
} // end of CondFilter
|
||||
|
||||
/***********************************************************************/
|
||||
/* Check the WHERE condition and return a MYSQL/ODBC/WQL filter. */
|
||||
/* Check the WHERE condition and return a MYSQL/ODBC/JDBC/WQL filter. */
|
||||
/***********************************************************************/
|
||||
PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond)
|
||||
{
|
||||
@@ -2635,8 +2638,8 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond)
|
||||
char *body= filp->Body;
|
||||
unsigned int i;
|
||||
bool ismul= false, x= (tty == TYPE_AM_MYX || tty == TYPE_AM_XDBC);
|
||||
bool nonul= (tty == TYPE_AM_ODBC && (tdbp->GetMode() == MODE_INSERT ||
|
||||
tdbp->GetMode() == MODE_DELETE));
|
||||
bool nonul= ((tty == TYPE_AM_ODBC || tty == TYPE_AM_JDBC) &&
|
||||
(tdbp->GetMode() == MODE_INSERT || tdbp->GetMode() == MODE_DELETE));
|
||||
OPVAL vop= OP_XX;
|
||||
|
||||
if (!cond)
|
||||
@@ -2958,7 +2961,7 @@ const COND *ha_connect::cond_push(const COND *cond)
|
||||
bool x= (tty == TYPE_AM_MYX || tty == TYPE_AM_XDBC);
|
||||
bool b= (tty == TYPE_AM_WMI || tty == TYPE_AM_ODBC ||
|
||||
tty == TYPE_AM_TBL || tty == TYPE_AM_MYSQL ||
|
||||
tty == TYPE_AM_PLG || x);
|
||||
tty == TYPE_AM_PLG || tty == TYPE_AM_JDBC || x);
|
||||
|
||||
// Save stack and allocation environment and prepare error return
|
||||
if (g->jump_level == MAX_JUMP) {
|
||||
@@ -4108,7 +4111,8 @@ bool ha_connect::check_privileges(THD *thd, PTOS options, char *dbn)
|
||||
|
||||
/* Fall through to check FILE_ACL */
|
||||
case TAB_ODBC:
|
||||
case TAB_MYSQL:
|
||||
case TAB_JDBC:
|
||||
case TAB_MYSQL:
|
||||
case TAB_DIR:
|
||||
case TAB_MAC:
|
||||
case TAB_WMI:
|
||||
@@ -5124,11 +5128,18 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
||||
int port= 0, hdr= 0, mxr= 0, mxe= 0, rc= 0;
|
||||
int cop __attribute__((unused))= 0, lrecl= 0;
|
||||
#if defined(ODBC_SUPPORT)
|
||||
POPARM sop = NULL;
|
||||
char *ucnc = NULL;
|
||||
POPARM sop= NULL;
|
||||
char *ucnc= NULL;
|
||||
bool cnc= false;
|
||||
int cto= -1, qto= -1;
|
||||
#endif // ODBC_SUPPORT
|
||||
#if defined(JDBC_SUPPORT)
|
||||
PJPARM sjp= NULL;
|
||||
char *jpath= NULL;
|
||||
char *driver= NULL;
|
||||
char *url= NULL;
|
||||
char *tabtyp = NULL;
|
||||
#endif // JDBC_SUPPORT
|
||||
uint tm, fnc= FNC_NO, supfnc= (FNC_NO | FNC_COL);
|
||||
bool bif, ok= false, dbf= false;
|
||||
TABTYPE ttp= TAB_UNDEF;
|
||||
@@ -5139,15 +5150,10 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
||||
PDBUSER dup= PlgGetUser(g);
|
||||
PCATLG cat= (dup) ? dup->Catalog : NULL;
|
||||
PTOS topt= table_s->option_struct;
|
||||
#if defined(NEW_WAY)
|
||||
//CHARSET_INFO *cs;
|
||||
Alter_info alter_info;
|
||||
#else // !NEW_WAY
|
||||
char buf[1024];
|
||||
String sql(buf, sizeof(buf), system_charset_info);
|
||||
|
||||
sql.copy(STRING_WITH_LEN("CREATE TABLE whatever ("), system_charset_info);
|
||||
#endif // !NEW_WAY
|
||||
|
||||
if (!g)
|
||||
return HA_ERR_INTERNAL_ERROR;
|
||||
@@ -5195,6 +5201,12 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
||||
if ((ucnc= GetListOption(g, "UseDSN", topt->oplist)))
|
||||
cnc= (!*ucnc || *ucnc == 'y' || *ucnc == 'Y' || atoi(ucnc) != 0);
|
||||
#endif
|
||||
#if defined(JDBC_SUPPORT)
|
||||
jpath= GetListOption(g, "Jpath", topt->oplist, NULL);
|
||||
driver= GetListOption(g, "Driver", topt->oplist, NULL);
|
||||
url= GetListOption(g, "URL", topt->oplist, NULL);
|
||||
tabtyp = GetListOption(g, "Tabtype", topt->oplist, NULL);
|
||||
#endif // JDBC_SUPPORT
|
||||
mxe= atoi(GetListOption(g,"maxerr", topt->oplist, "0"));
|
||||
#if defined(PROMPT_OK)
|
||||
cop= atoi(GetListOption(g, "checkdsn", topt->oplist, "0"));
|
||||
@@ -5255,44 +5267,62 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
||||
} else if (ttp != TAB_ODBC || !(fnc & (FNC_TABLE | FNC_COL)))
|
||||
tab= table_s->table_name.str; // Default value
|
||||
|
||||
#if defined(NEW_WAY)
|
||||
// add_option(thd, create_info, "tabname", tab);
|
||||
#endif // NEW_WAY
|
||||
} // endif tab
|
||||
|
||||
switch (ttp) {
|
||||
switch (ttp) {
|
||||
#if defined(ODBC_SUPPORT)
|
||||
case TAB_ODBC:
|
||||
dsn= strz(g, create_info->connect_string);
|
||||
case TAB_ODBC:
|
||||
dsn= strz(g, create_info->connect_string);
|
||||
|
||||
if (fnc & (FNC_DSN | FNC_DRIVER)) {
|
||||
ok= true;
|
||||
if (fnc & (FNC_DSN | FNC_DRIVER)) {
|
||||
ok= true;
|
||||
#if defined(PROMPT_OK)
|
||||
} else if (!stricmp(thd->main_security_ctx.host, "localhost")
|
||||
&& cop == 1) {
|
||||
if ((dsn = ODBCCheckConnection(g, dsn, cop)) != NULL) {
|
||||
thd->make_lex_string(&create_info->connect_string, dsn, strlen(dsn));
|
||||
ok= true;
|
||||
} // endif dsn
|
||||
} else if (!stricmp(thd->main_security_ctx.host, "localhost")
|
||||
&& cop == 1) {
|
||||
if ((dsn = ODBCCheckConnection(g, dsn, cop)) != NULL) {
|
||||
thd->make_lex_string(&create_info->connect_string, dsn, strlen(dsn));
|
||||
ok= true;
|
||||
} // endif dsn
|
||||
#endif // PROMPT_OK
|
||||
|
||||
} else if (!dsn) {
|
||||
sprintf(g->Message, "Missing %s connection string", topt->type);
|
||||
} else {
|
||||
// Store ODBC additional parameters
|
||||
sop= (POPARM)PlugSubAlloc(g, NULL, sizeof(ODBCPARM));
|
||||
sop->User= (char*)user;
|
||||
sop->Pwd= (char*)pwd;
|
||||
sop->Cto= cto;
|
||||
sop->Qto= qto;
|
||||
sop->UseCnc= cnc;
|
||||
ok= true;
|
||||
} // endif's
|
||||
} else if (!dsn) {
|
||||
sprintf(g->Message, "Missing %s connection string", topt->type);
|
||||
} else {
|
||||
// Store ODBC additional parameters
|
||||
sop= (POPARM)PlugSubAlloc(g, NULL, sizeof(ODBCPARM));
|
||||
sop->User= (char*)user;
|
||||
sop->Pwd= (char*)pwd;
|
||||
sop->Cto= cto;
|
||||
sop->Qto= qto;
|
||||
sop->UseCnc= cnc;
|
||||
ok= true;
|
||||
} // endif's
|
||||
|
||||
supfnc |= (FNC_TABLE | FNC_DSN | FNC_DRIVER);
|
||||
break;
|
||||
supfnc |= (FNC_TABLE | FNC_DSN | FNC_DRIVER);
|
||||
break;
|
||||
#endif // ODBC_SUPPORT
|
||||
case TAB_DBF:
|
||||
#if defined(JDBC_SUPPORT)
|
||||
case TAB_JDBC:
|
||||
if (fnc & FNC_DRIVER) {
|
||||
ok= true;
|
||||
} else if (!url) {
|
||||
strcpy(g->Message, "Missing URL");
|
||||
} else {
|
||||
// Store ODBC additional parameters
|
||||
sjp= (PJPARM)PlugSubAlloc(g, NULL, sizeof(JDBCPARM));
|
||||
sjp->Driver= driver;
|
||||
sjp->Url= url;
|
||||
sjp->User= (char*)user;
|
||||
sjp->Pwd= (char*)pwd;
|
||||
sjp->Fsize= 0;
|
||||
sjp->Scrollable= false;
|
||||
ok= true;
|
||||
} // endif's
|
||||
|
||||
supfnc |= (FNC_DRIVER | FNC_TABLE);
|
||||
break;
|
||||
#endif // JDBC_SUPPORT
|
||||
case TAB_DBF:
|
||||
dbf= true;
|
||||
// Passthru
|
||||
case TAB_CSV:
|
||||
@@ -5411,7 +5441,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
||||
|
||||
dpath= SetPath(g, table_s->db.str);
|
||||
|
||||
if (src && ttp != TAB_PIVOT && ttp != TAB_ODBC) {
|
||||
if (src && ttp != TAB_PIVOT && ttp != TAB_ODBC && ttp != TAB_JDBC) {
|
||||
qrp= SrcColumns(g, host, db, user, pwd, src, port);
|
||||
|
||||
if (qrp && ttp == TAB_OCCUR)
|
||||
@@ -5453,7 +5483,38 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
||||
|
||||
break;
|
||||
#endif // ODBC_SUPPORT
|
||||
case TAB_MYSQL:
|
||||
#if defined(JDBC_SUPPORT)
|
||||
case TAB_JDBC:
|
||||
switch (fnc) {
|
||||
case FNC_NO:
|
||||
case FNC_COL:
|
||||
if (src) {
|
||||
qrp= JDBCSrcCols(g, jpath, (char*)src, sjp);
|
||||
src= NULL; // for next tests
|
||||
} else
|
||||
qrp= JDBCColumns(g, jpath, shm, tab, NULL,
|
||||
mxr, fnc == FNC_COL, sjp);
|
||||
|
||||
break;
|
||||
case FNC_TABLE:
|
||||
qrp= JDBCTables(g, dsn, shm, tab, tabtyp, mxr, true, sjp);
|
||||
break;
|
||||
#if 0
|
||||
case FNC_DSN:
|
||||
qrp= JDBCDataSources(g, mxr, true);
|
||||
break;
|
||||
#endif // 0
|
||||
case FNC_DRIVER:
|
||||
qrp= JDBCDrivers(g, jpath, mxr, true);
|
||||
break;
|
||||
default:
|
||||
sprintf(g->Message, "invalid catfunc %s", fncn);
|
||||
break;
|
||||
} // endswitch info
|
||||
|
||||
break;
|
||||
#endif // JDBC_SUPPORT
|
||||
case TAB_MYSQL:
|
||||
qrp= MyColumns(g, thd, host, db, user, pwd, tab,
|
||||
NULL, port, fnc == FNC_COL);
|
||||
break;
|
||||
@@ -5526,14 +5587,9 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
||||
len= 256; // STRBLK's have 0 length
|
||||
|
||||
// Now add the field
|
||||
#if defined(NEW_WAY)
|
||||
rc= add_fields(g, thd, &alter_info, cnm, typ, len, dec,
|
||||
tm, "", flg, dbf, v);
|
||||
#else // !NEW_WAY
|
||||
if (add_field(&sql, cnm, typ, len, dec, NULL, tm,
|
||||
NULL, NULL, NULL, NULL, flg, dbf, v))
|
||||
rc= HA_ERR_OUT_OF_MEM;
|
||||
#endif // !NEW_WAY
|
||||
} // endfor crp
|
||||
|
||||
} else {
|
||||
@@ -5556,12 +5612,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
||||
cnm= (char*)"noname";
|
||||
dft= xtra= key= fmt= NULL;
|
||||
v= ' ';
|
||||
#if defined(NEW_WAY)
|
||||
rem= "";
|
||||
// cs= NULL;
|
||||
#else // !NEW_WAY
|
||||
rem= NULL;
|
||||
#endif // !NEW_WAY
|
||||
|
||||
for (crp= qrp->Colresp; crp; crp= crp->Next)
|
||||
switch (crp->Fld) {
|
||||
@@ -5630,10 +5681,10 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
||||
"Several %s tables found, specify DBNAME", tab);
|
||||
my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0));
|
||||
goto err;
|
||||
} else if (!schem)
|
||||
} else if (!schem)
|
||||
schem= crp->Kdata->GetCharValue(i);
|
||||
|
||||
} // endif ttp
|
||||
} // endif ttp
|
||||
#endif // ODBC_SUPPORT
|
||||
default:
|
||||
break; // Ignore
|
||||
@@ -5682,7 +5733,42 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
||||
|
||||
} else
|
||||
#endif // ODBC_SUPPORT
|
||||
// Make the arguments as required by add_fields
|
||||
#if defined(JDBC_SUPPORT)
|
||||
if (ttp == TAB_JDBC) {
|
||||
int plgtyp;
|
||||
|
||||
// typ must be PLG type, not SQL type
|
||||
if (!(plgtyp= TranslateJDBCType(typ, dec, prec, v))) {
|
||||
if (GetTypeConv() == TPC_SKIP) {
|
||||
// Skip this column
|
||||
sprintf(g->Message, "Column %s skipped (unsupported type %d)",
|
||||
cnm, typ);
|
||||
push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
|
||||
continue;
|
||||
} else {
|
||||
sprintf(g->Message, "Unsupported SQL type %d", typ);
|
||||
my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0));
|
||||
goto err;
|
||||
} // endif type_conv
|
||||
|
||||
} else
|
||||
typ= plgtyp;
|
||||
|
||||
switch (typ) {
|
||||
case TYPE_DOUBLE:
|
||||
// Some data sources do not count dec in length (prec)
|
||||
prec += (dec + 2); // To be safe
|
||||
break;
|
||||
case TYPE_DECIM:
|
||||
prec= len;
|
||||
break;
|
||||
default:
|
||||
dec= 0;
|
||||
} // endswitch typ
|
||||
|
||||
} else
|
||||
#endif // ODBC_SUPPORT
|
||||
// Make the arguments as required by add_fields
|
||||
if (typ == TYPE_DOUBLE)
|
||||
prec= len;
|
||||
|
||||
@@ -5690,25 +5776,15 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
|
||||
prec= 0;
|
||||
|
||||
// Now add the field
|
||||
#if defined(NEW_WAY)
|
||||
rc= add_fields(g, thd, &alter_info, cnm, typ, prec, dec,
|
||||
tm, rem, 0, dbf, v);
|
||||
#else // !NEW_WAY
|
||||
if (add_field(&sql, cnm, typ, prec, dec, key, tm, rem, dft, xtra,
|
||||
fmt, 0, dbf, v))
|
||||
rc= HA_ERR_OUT_OF_MEM;
|
||||
#endif // !NEW_WAY
|
||||
} // endfor i
|
||||
|
||||
} // endif fnc
|
||||
|
||||
#if defined(NEW_WAY)
|
||||
rc= init_table_share(thd, table_s, create_info, &alter_info);
|
||||
#else // !NEW_WAY
|
||||
if (!rc)
|
||||
rc= init_table_share(thd, table_s, create_info, &sql);
|
||||
// rc= init_table_share(thd, table_s, create_info, dsn, &sql);
|
||||
#endif // !NEW_WAY
|
||||
|
||||
g->jump_level--;
|
||||
return rc;
|
||||
|
||||
29
storage/connect/jdbccat.h
Normal file
29
storage/connect/jdbccat.h
Normal file
@@ -0,0 +1,29 @@
|
||||
// Timeout and net wait defaults
|
||||
#define DEFAULT_LOGIN_TIMEOUT -1 // means do not set
|
||||
#define DEFAULT_QUERY_TIMEOUT -1 // means do not set
|
||||
|
||||
typedef struct jdbc_parms {
|
||||
int CheckSize(int rows);
|
||||
char *Driver; // JDBC driver
|
||||
char *Url; // Driver URL
|
||||
char *User; // User connect info
|
||||
char *Pwd; // Password connect info
|
||||
//int Cto; // Connect timeout
|
||||
//int Qto; // Query timeout
|
||||
int Fsize; // Fetch size
|
||||
bool Scrollable; // Scrollable cursor
|
||||
} JDBCPARM, *PJPARM;
|
||||
|
||||
/***********************************************************************/
|
||||
/* JDBC catalog function prototypes. */
|
||||
/***********************************************************************/
|
||||
#if defined(PROMPT_OK)
|
||||
char *JDBCCheckConnection(PGLOBAL g, char *dsn, int cop);
|
||||
#endif // PROMPT_OK
|
||||
//PQRYRES JDBCDataSources(PGLOBAL g, int maxres, bool info);
|
||||
PQRYRES JDBCColumns(PGLOBAL g, char *jpath, char *db, char *table,
|
||||
char *colpat, int maxres, bool info, PJPARM sop);
|
||||
PQRYRES JDBCSrcCols(PGLOBAL g, char *jpath, char *src, PJPARM sop);
|
||||
PQRYRES JDBCTables(PGLOBAL g, char *jpath, char *db, char *tabpat,
|
||||
char *tabtyp, int maxres, bool info, PJPARM sop);
|
||||
PQRYRES JDBCDrivers(PGLOBAL g, char *jpath, int maxres, bool info);
|
||||
2015
storage/connect/jdbconn.cpp
Normal file
2015
storage/connect/jdbconn.cpp
Normal file
File diff suppressed because it is too large
Load Diff
173
storage/connect/jdbconn.h
Normal file
173
storage/connect/jdbconn.h
Normal file
@@ -0,0 +1,173 @@
|
||||
/***********************************************************************/
|
||||
/* JDBConn.h : header file for the JDBC connection classes. */
|
||||
/***********************************************************************/
|
||||
//nclude <windows.h> /* Windows include file */
|
||||
//nclude <windowsx.h> /* Message crackers */
|
||||
|
||||
/***********************************************************************/
|
||||
/* Included C-definition files required by the interface. */
|
||||
/***********************************************************************/
|
||||
#include "block.h"
|
||||
|
||||
/***********************************************************************/
|
||||
/* JDBC interface. */
|
||||
/***********************************************************************/
|
||||
#include <jni.h>
|
||||
|
||||
/***********************************************************************/
|
||||
/* Constants and defines. */
|
||||
/***********************************************************************/
|
||||
// Miscellaneous sizing info
|
||||
#define MAX_NUM_OF_MSG 10 // Max number of error messages
|
||||
//efine MAX_CURRENCY 30 // Max size of Currency($) string
|
||||
#define MAX_TNAME_LEN 32 // Max size of table names
|
||||
//efine MAX_FNAME_LEN 256 // Max size of field names
|
||||
//efine MAX_STRING_INFO 256 // Max size of string from SQLGetInfo
|
||||
//efine MAX_DNAME_LEN 256 // Max size of Recordset names
|
||||
#define MAX_CONNECT_LEN 512 // Max size of Connect string
|
||||
//efine MAX_CURSOR_NAME 18 // Max size of a cursor name
|
||||
#define DEFAULT_FIELD_TYPE 0 // TYPE_NULL
|
||||
|
||||
#if !defined(__WIN__)
|
||||
typedef unsigned char *PUCHAR;
|
||||
#endif // !__WIN__
|
||||
|
||||
// Field Flags, used to indicate status of fields
|
||||
//efine SQL_FIELD_FLAG_DIRTY 0x1
|
||||
//efine SQL_FIELD_FLAG_NULL 0x2
|
||||
|
||||
// Update options flags
|
||||
//efine SQL_SETPOSUPDATES 0x0001
|
||||
//efine SQL_POSITIONEDSQL 0x0002
|
||||
//efine SQL_GDBOUND 0x0004
|
||||
|
||||
enum JCATINFO {
|
||||
CAT_TAB = 1, // JDBC Tables
|
||||
CAT_COL = 2, // JDBC Columns
|
||||
CAT_KEY = 3, // JDBC PrimaryKeys
|
||||
//CAT_STAT = 4, // SQLStatistics
|
||||
//CAT_SPC = 5 // SQLSpecialColumns
|
||||
};
|
||||
|
||||
/***********************************************************************/
|
||||
/* This structure is used to control the catalog functions. */
|
||||
/***********************************************************************/
|
||||
typedef struct tagJCATPARM {
|
||||
JCATINFO Id; // Id to indicate function
|
||||
PQRYRES Qrp; // Result set pointer
|
||||
PUCHAR DB; // Database (Schema)
|
||||
PUCHAR Tab; // Table name or pattern
|
||||
PUCHAR Pat; // Table type or column pattern
|
||||
} JCATPARM;
|
||||
|
||||
// JDBC connection to a data source
|
||||
class TDBJDBC;
|
||||
class JDBCCOL;
|
||||
class JDBConn;
|
||||
class TDBXJDC;
|
||||
|
||||
/***********************************************************************/
|
||||
/* JDBConn class. */
|
||||
/***********************************************************************/
|
||||
class JDBConn : public BLOCK {
|
||||
friend class TDBJDBC;
|
||||
friend class TDBXJDC;
|
||||
//friend PQRYRES GetColumnInfo(PGLOBAL, char*&, char *, int, PVBLK&);
|
||||
private:
|
||||
JDBConn(); // Standard (unused) constructor
|
||||
|
||||
public:
|
||||
JDBConn(PGLOBAL g, TDBJDBC *tdbp);
|
||||
|
||||
int Open(PSZ jpath, PJPARM sop);
|
||||
int Rewind(char *sql);
|
||||
void Close(void);
|
||||
PQRYRES AllocateResult(PGLOBAL g);
|
||||
|
||||
// Attributes
|
||||
public:
|
||||
char *GetQuoteChar(void) { return m_IDQuoteChar; }
|
||||
// Database successfully opened?
|
||||
bool IsOpen(void) { return m_Opened; }
|
||||
//PSZ GetStringInfo(ushort infotype);
|
||||
int GetMaxValue(int infotype);
|
||||
//PSZ GetConnect(void) { return m_Connect; }
|
||||
|
||||
public:
|
||||
// Operations
|
||||
//void SetLoginTimeout(DWORD sec) {m_LoginTimeout = sec;}
|
||||
//void SetQueryTimeout(DWORD sec) {m_QueryTimeout = sec;}
|
||||
//void SetUserName(PSZ user) {m_User = user;}
|
||||
//void SetUserPwd(PSZ pwd) {m_Pwd = pwd;}
|
||||
int GetResultSize(char *sql, JDBCCOL *colp);
|
||||
int ExecuteQuery(char *sql);
|
||||
int ExecuteUpdate(char *sql);
|
||||
int Fetch(int pos = 0);
|
||||
int PrepareSQL(char *sql);
|
||||
//int ExecuteSQL(void);
|
||||
//bool BindParam(JDBCCOL *colp);
|
||||
int ExecSQLcommand(char *sql);
|
||||
void SetColumnValue(int rank, PSZ name, PVAL val);
|
||||
int GetCatInfo(JCATPARM *cap);
|
||||
//bool GetDataSources(PQRYRES qrp);
|
||||
bool GetDrivers(PQRYRES qrp);
|
||||
PQRYRES GetMetaData(PGLOBAL g, char *src);
|
||||
|
||||
public:
|
||||
// Set special options
|
||||
//void OnSetOptions(HSTMT hstmt);
|
||||
|
||||
// Implementation
|
||||
public:
|
||||
//virtual ~JDBConn();
|
||||
|
||||
// JDBC operations
|
||||
protected:
|
||||
//bool Check(RETCODE rc);
|
||||
//void ThrowDJX(int rc, PSZ msg/*, HSTMT hstmt = SQL_NULL_HSTMT*/);
|
||||
//void ThrowDJX(PSZ msg);
|
||||
//void AllocConnect(DWORD dwOptions);
|
||||
//void Connect(void);
|
||||
//bool DriverConnect(DWORD Options);
|
||||
//void VerifyConnect(void);
|
||||
//void GetConnectInfo(void);
|
||||
//void Free(void);
|
||||
|
||||
protected:
|
||||
// Static members
|
||||
//static HENV m_henv;
|
||||
//static int m_nAlloc; // per-Appl reference to HENV above
|
||||
|
||||
// Members
|
||||
PGLOBAL m_G;
|
||||
TDBJDBC *m_Tdb;
|
||||
JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine)
|
||||
JNIEnv *env; // Pointer to native interface
|
||||
jclass jdi; // Pointer to the JdbcInterface class
|
||||
jobject job; // The JdbcInterface class object
|
||||
jmethodID xqid; // The ExecuteQuery method ID
|
||||
jmethodID xuid; // The ExecuteUpdate method ID
|
||||
jmethodID xid; // The Execute method ID
|
||||
jmethodID grs; // The GetResult method ID
|
||||
jmethodID readid; // The ReadNext method ID
|
||||
jmethodID fetchid; // The Fetch method ID
|
||||
jmethodID typid; // The ColumnType method ID
|
||||
//DWORD m_LoginTimeout;
|
||||
//DWORD m_QueryTimeout;
|
||||
//DWORD m_UpdateOptions;
|
||||
char m_IDQuoteChar[2];
|
||||
PSZ m_Driver;
|
||||
PSZ m_Url;
|
||||
PSZ m_User;
|
||||
PSZ m_Pwd;
|
||||
int m_Ncol;
|
||||
int m_Aff;
|
||||
int m_Rows;
|
||||
int m_Fetch;
|
||||
int m_RowsetSize;
|
||||
jboolean m_Updatable;
|
||||
jboolean m_Transact;
|
||||
jboolean m_Scrollable;
|
||||
bool m_Opened;
|
||||
bool m_Full;
|
||||
}; // end of JDBConn class definition
|
||||
@@ -80,6 +80,10 @@
|
||||
#define NODBC
|
||||
#include "tabodbc.h"
|
||||
#endif // ODBC_SUPPORT
|
||||
#if defined(JDBC_SUPPORT)
|
||||
#define NJDBC
|
||||
#include "tabjdbc.h"
|
||||
#endif // ODBC_SUPPORT
|
||||
#if defined(PIVOT_SUPPORT)
|
||||
#include "tabpivot.h"
|
||||
#endif // PIVOT_SUPPORT
|
||||
@@ -140,7 +144,10 @@ TABTYPE GetTypeID(const char *type)
|
||||
#ifdef ODBC_SUPPORT
|
||||
: (!stricmp(type, "ODBC")) ? TAB_ODBC
|
||||
#endif
|
||||
: (!stricmp(type, "MYSQL")) ? TAB_MYSQL
|
||||
#ifdef JDBC_SUPPORT
|
||||
: (!stricmp(type, "JDBC")) ? TAB_JDBC
|
||||
#endif
|
||||
: (!stricmp(type, "MYSQL")) ? TAB_MYSQL
|
||||
: (!stricmp(type, "MYPRX")) ? TAB_MYSQL
|
||||
: (!stricmp(type, "DIR")) ? TAB_DIR
|
||||
#ifdef __WIN__
|
||||
@@ -301,12 +308,12 @@ int GetIndexType(TABTYPE type)
|
||||
break;
|
||||
case TAB_MYSQL:
|
||||
case TAB_ODBC:
|
||||
xtyp= 2;
|
||||
case TAB_JDBC:
|
||||
xtyp= 2;
|
||||
break;
|
||||
case TAB_VIR:
|
||||
xtyp= 3;
|
||||
break;
|
||||
// case TAB_ODBC:
|
||||
default:
|
||||
xtyp= 0;
|
||||
break;
|
||||
@@ -558,6 +565,9 @@ PRELDEF MYCAT::MakeTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR am)
|
||||
#if defined(ODBC_SUPPORT)
|
||||
case TAB_ODBC: tdp= new(g) ODBCDEF; break;
|
||||
#endif // ODBC_SUPPORT
|
||||
#if defined(JDBC_SUPPORT)
|
||||
case TAB_JDBC: tdp= new(g)JDBCDEF; break;
|
||||
#endif // JDBC_SUPPORT
|
||||
#if defined(__WIN__)
|
||||
case TAB_MAC: tdp= new(g) MACDEF; break;
|
||||
case TAB_WMI: tdp= new(g) WMIDEF; break;
|
||||
|
||||
@@ -1458,7 +1458,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols)
|
||||
n++;
|
||||
|
||||
// n can be 0 for query such as Select count(*) from table
|
||||
if (n && n != (UWORD)ncol)
|
||||
if (n && n > (UWORD)ncol)
|
||||
ThrowDBX(MSG(COL_NUM_MISM));
|
||||
|
||||
// Now bind the column buffers
|
||||
|
||||
@@ -77,7 +77,8 @@ enum TABTYPE {TAB_UNDEF = 0, /* Table of undefined type */
|
||||
TAB_JSON = 23, /* JSON tables */
|
||||
TAB_JCT = 24, /* Junction tables NIY */
|
||||
TAB_DMY = 25, /* DMY Dummy tables NIY */
|
||||
TAB_NIY = 26}; /* Table not implemented yet */
|
||||
TAB_JDBC = 26, /* Table accessed via JDBC */
|
||||
TAB_NIY = 27}; /* Table not implemented yet */
|
||||
|
||||
enum AMT {TYPE_AM_ERROR = 0, /* Type not defined */
|
||||
TYPE_AM_ROWID = 1, /* ROWID type (special column) */
|
||||
@@ -109,7 +110,9 @@ enum AMT {TYPE_AM_ERROR = 0, /* Type not defined */
|
||||
TYPE_AM_DIR = 90, /* DIR access method type no */
|
||||
TYPE_AM_ODBC = 100, /* ODBC access method type no */
|
||||
TYPE_AM_XDBC = 101, /* XDBC access method type no */
|
||||
TYPE_AM_OEM = 110, /* OEM access method type no */
|
||||
TYPE_AM_JDBC = 102, /* JDBC access method type no */
|
||||
TYPE_AM_XJDC = 103, /* XJDC access method type no */
|
||||
TYPE_AM_OEM = 110, /* OEM access method type no */
|
||||
TYPE_AM_TBL = 115, /* TBL access method type no */
|
||||
TYPE_AM_PIVOT = 120, /* PIVOT access method type no */
|
||||
TYPE_AM_SRC = 121, /* PIVOT multiple column type no */
|
||||
@@ -146,8 +149,9 @@ enum RECFM {RECFM_NAF = -2, /* Not a file */
|
||||
RECFM_BIN = 2, /* Binary DOS files (also fixed) */
|
||||
RECFM_VCT = 3, /* VCT formatted files */
|
||||
RECFM_ODBC = 4, /* Table accessed via ODBC */
|
||||
RECFM_PLG = 5, /* Table accessed via PLGconn */
|
||||
RECFM_DBF = 6}; /* DBase formatted file */
|
||||
RECFM_JDBC = 5, /* Table accessed via JDBC */
|
||||
RECFM_PLG = 6, /* Table accessed via PLGconn */
|
||||
RECFM_DBF = 7}; /* DBase formatted file */
|
||||
|
||||
enum MISC {DB_TABNO = 1, /* DB routines in Utility Table */
|
||||
MAX_MULT_KEY = 10, /* Max multiple key number */
|
||||
|
||||
@@ -1102,7 +1102,8 @@ char *GetAmName(PGLOBAL g, AMT am, void *memp)
|
||||
case TYPE_AM_DOM: strcpy(amn, "DOM"); break;
|
||||
case TYPE_AM_DIR: strcpy(amn, "DIR"); break;
|
||||
case TYPE_AM_ODBC: strcpy(amn, "ODBC"); break;
|
||||
case TYPE_AM_MAC: strcpy(amn, "MAC"); break;
|
||||
case TYPE_AM_JDBC: strcpy(amn, "JDBC"); break;
|
||||
case TYPE_AM_MAC: strcpy(amn, "MAC"); break;
|
||||
case TYPE_AM_OEM: strcpy(amn, "OEM"); break;
|
||||
case TYPE_AM_OUT: strcpy(amn, "OUT"); break;
|
||||
default: sprintf(amn, "OEM(%d)", am);
|
||||
|
||||
@@ -305,7 +305,7 @@ int TABDEF::GetColCatInfo(PGLOBAL g)
|
||||
case TAB_OEM:
|
||||
poff = 0; // Offset represents an independant flag
|
||||
break;
|
||||
default: // VCT PLG ODBC MYSQL WMI...
|
||||
default: // VCT PLG ODBC JDBC MYSQL WMI...
|
||||
poff = 0; // NA
|
||||
break;
|
||||
} // endswitch tc
|
||||
|
||||
1695
storage/connect/tabjdbc.cpp
Normal file
1695
storage/connect/tabjdbc.cpp
Normal file
File diff suppressed because it is too large
Load Diff
347
storage/connect/tabjdbc.h
Normal file
347
storage/connect/tabjdbc.h
Normal file
@@ -0,0 +1,347 @@
|
||||
/*************** Tabjdbc H Declares Source Code File (.H) **************/
|
||||
/* Name: TABJDBC.H Version 1.0 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2016 */
|
||||
/* */
|
||||
/* This file contains the TDBJDBC classes declares. */
|
||||
/***********************************************************************/
|
||||
#include "colblk.h"
|
||||
#include "resource.h"
|
||||
|
||||
typedef class JDBCDEF *PJDBCDEF;
|
||||
typedef class TDBJDBC *PTDBJDBC;
|
||||
typedef class JDBCCOL *PJDBCCOL;
|
||||
typedef class TDBXJDC *PTDBXJDC;
|
||||
typedef class JSRCCOL *PJSRCCOL;
|
||||
//typedef class TDBOIF *PTDBOIF;
|
||||
//typedef class OIFCOL *POIFCOL;
|
||||
//typedef class TDBJSRC *PTDBJSRC;
|
||||
|
||||
/***********************************************************************/
|
||||
/* JDBC table. */
|
||||
/***********************************************************************/
|
||||
class DllExport JDBCDEF : public TABDEF { /* Logical table description */
|
||||
friend class TDBJDBC;
|
||||
friend class TDBXJDC;
|
||||
friend class TDBJDRV;
|
||||
friend class TDBJTB;
|
||||
public:
|
||||
// Constructor
|
||||
JDBCDEF(void);
|
||||
|
||||
// Implementation
|
||||
virtual const char *GetType(void) { return "JDBC"; }
|
||||
PSZ GetJpath(void) { return Jpath; }
|
||||
PSZ GetTabname(void) { return Tabname; }
|
||||
PSZ GetTabschema(void) { return Tabschema; }
|
||||
PSZ GetTabcat(void) { return Tabcat; }
|
||||
PSZ GetSrcdef(void) { return Srcdef; }
|
||||
char GetSep(void) { return (Sep) ? *Sep : 0; }
|
||||
int GetQuoted(void) { return Quoted; }
|
||||
//int GetCatver(void) { return Catver; }
|
||||
int GetOptions(void) { return Options; }
|
||||
|
||||
// Methods
|
||||
virtual int Indexable(void) { return 2; }
|
||||
virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff);
|
||||
virtual PTDB GetTable(PGLOBAL g, MODE m);
|
||||
|
||||
protected:
|
||||
// Members
|
||||
PSZ Jpath; /* Java class path */
|
||||
PSZ Driver; /* JDBC driver */
|
||||
PSZ Url; /* JDBC driver URL */
|
||||
PSZ Tabname; /* External table name */
|
||||
PSZ Tabschema; /* External table schema */
|
||||
PSZ Username; /* User connect name */
|
||||
PSZ Password; /* Password connect info */
|
||||
PSZ Tabcat; /* External table catalog */
|
||||
PSZ Tabtype; /* External table type */
|
||||
PSZ Srcdef; /* The source table SQL definition */
|
||||
PSZ Qchar; /* Identifier quoting character */
|
||||
PSZ Qrystr; /* The original query */
|
||||
PSZ Sep; /* Decimal separator */
|
||||
int Options; /* Open connection options */
|
||||
//int Cto; /* Open connection timeout */
|
||||
//int Qto; /* Query (command) timeout */
|
||||
int Quoted; /* Identifier quoting level */
|
||||
int Maxerr; /* Maxerr for an Exec table */
|
||||
int Maxres; /* Maxres for a catalog table */
|
||||
int Memory; /* Put result set in memory */
|
||||
bool Scrollable; /* Use scrollable cursor */
|
||||
bool Xsrc; /* Execution type */
|
||||
}; // end of JDBCDEF
|
||||
|
||||
#if !defined(NJDBC)
|
||||
#include "JDBConn.h"
|
||||
|
||||
/***********************************************************************/
|
||||
/* This is the JDBC Access Method class declaration for files from */
|
||||
/* other DB drivers to be accessed via JDBC. */
|
||||
/***********************************************************************/
|
||||
class TDBJDBC : public TDBASE {
|
||||
friend class JDBCCOL;
|
||||
friend class JDBConn;
|
||||
public:
|
||||
// Constructor
|
||||
TDBJDBC(PJDBCDEF tdp = NULL);
|
||||
TDBJDBC(PTDBJDBC tdbp);
|
||||
|
||||
// Implementation
|
||||
virtual AMT GetAmType(void) { return TYPE_AM_JDBC; }
|
||||
virtual PTDB Duplicate(PGLOBAL g) { return (PTDB)new(g)TDBJDBC(this); }
|
||||
|
||||
// Methods
|
||||
virtual PTDB CopyOne(PTABS t);
|
||||
virtual int GetRecpos(void);
|
||||
virtual bool SetRecpos(PGLOBAL g, int recpos);
|
||||
//virtual PSZ GetFile(PGLOBAL g);
|
||||
//virtual void SetFile(PGLOBAL g, PSZ fn);
|
||||
virtual void ResetSize(void);
|
||||
//virtual int GetAffectedRows(void) {return AftRows;}
|
||||
virtual PSZ GetServer(void) { return "JDBC"; }
|
||||
virtual int Indexable(void) { return 2; }
|
||||
|
||||
// Database routines
|
||||
virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n);
|
||||
virtual int Cardinality(PGLOBAL g);
|
||||
virtual int GetMaxSize(PGLOBAL g);
|
||||
virtual int GetProgMax(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);
|
||||
virtual bool ReadKey(PGLOBAL g, OPVAL op, const key_range *kr);
|
||||
|
||||
protected:
|
||||
// Internal functions
|
||||
int Decode(char *utf, char *buf, size_t n);
|
||||
bool MakeSQL(PGLOBAL g, bool cnt);
|
||||
bool MakeInsert(PGLOBAL g);
|
||||
bool MakeCommand(PGLOBAL g);
|
||||
//bool MakeFilter(PGLOBAL g, bool c);
|
||||
bool BindParameters(PGLOBAL g);
|
||||
//char *MakeUpdate(PGLOBAL g);
|
||||
//char *MakeDelete(PGLOBAL g);
|
||||
|
||||
// Members
|
||||
JDBConn *Jcp; // Points to a JDBC connection class
|
||||
JDBCCOL *Cnp; // Points to count(*) column
|
||||
JDBCPARM Ops; // Additional parameters
|
||||
PSTRG Query; // Constructed SQL query
|
||||
char *Jpath; // Java class path
|
||||
char *TableName; // Points to JDBC table name
|
||||
char *Schema; // Points to JDBC table Schema
|
||||
char *User; // User connect info
|
||||
char *Pwd; // Password connect info
|
||||
char *Catalog; // Points to JDBC table Catalog
|
||||
char *Srcdef; // The source table SQL definition
|
||||
char *Count; // Points to count(*) SQL statement
|
||||
//char *Where; // Points to local where clause
|
||||
char *Quote; // The identifier quoting character
|
||||
char *MulConn; // Used for multiple JDBC tables
|
||||
char *DBQ; // The address part of Connect string
|
||||
char *Qrystr; // The original query
|
||||
char Sep; // The decimal separator
|
||||
int Options; // Connect options
|
||||
//int Cto; // Connect timeout
|
||||
//int Qto; // Query timeout
|
||||
int Quoted; // The identifier quoting level
|
||||
int Fpos; // Position of last read record
|
||||
int Curpos; // Cursor position of last fetch
|
||||
int AftRows; // The number of affected rows
|
||||
int Rows; // Rowset size
|
||||
int CurNum; // Current buffer line number
|
||||
int Rbuf; // Number of lines read in buffer
|
||||
int BufSize; // Size of connect string buffer
|
||||
int Ncol; // The column number
|
||||
int Nparm; // The number of statement parameters
|
||||
int Memory; // 0: No 1: Alloc 2: Put 3: Get
|
||||
//bool Scrollable; // Use scrollable cursor --> in Ops
|
||||
bool Placed; // True for position reading
|
||||
bool Werr; // Write error
|
||||
bool Rerr; // Rewind error
|
||||
PQRYRES Qrp; // Points to storage result
|
||||
}; // end of class TDBJDBC
|
||||
|
||||
/***********************************************************************/
|
||||
/* Class JDBCCOL: JDBC access method column descriptor. */
|
||||
/* This A.M. is used for JDBC tables. */
|
||||
/***********************************************************************/
|
||||
class JDBCCOL : public COLBLK {
|
||||
friend class TDBJDBC;
|
||||
public:
|
||||
// Constructors
|
||||
JDBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "JDBC");
|
||||
JDBCCOL(JDBCCOL *colp, PTDB tdbp); // Constructor used in copy process
|
||||
|
||||
// Implementation
|
||||
virtual int GetAmType(void) { return TYPE_AM_JDBC; }
|
||||
//SQLLEN *GetStrLen(void) { return StrLen; }
|
||||
int GetRank(void) { return Rank; }
|
||||
//PVBLK GetBlkp(void) {return Blkp;}
|
||||
void SetCrp(PCOLRES crp) { Crp = crp; }
|
||||
|
||||
// Methods
|
||||
virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check);
|
||||
virtual void ReadColumn(PGLOBAL g);
|
||||
virtual void WriteColumn(PGLOBAL g);
|
||||
//void AllocateBuffers(PGLOBAL g, int rows);
|
||||
//void *GetBuffer(DWORD rows);
|
||||
//SWORD GetBuflen(void);
|
||||
// void Print(PGLOBAL g, FILE *, uint);
|
||||
|
||||
protected:
|
||||
// Constructor used by GetMaxSize
|
||||
JDBCCOL(void);
|
||||
|
||||
// Members
|
||||
//TIMESTAMP_STRUCT *Sqlbuf; // To get SQL_TIMESTAMP's
|
||||
PCOLRES Crp; // To storage result
|
||||
void *Bufp; // To extended buffer
|
||||
PVBLK Blkp; // To Value Block
|
||||
//char F_Date[12]; // Internal Date format
|
||||
PVAL To_Val; // To value used for Insert
|
||||
//SQLLEN *StrLen; // As returned by JDBC
|
||||
//SQLLEN Slen; // Used with Fetch
|
||||
int Rank; // Rank (position) number in the query
|
||||
}; // end of class JDBCCOL
|
||||
|
||||
/***********************************************************************/
|
||||
/* This is the JDBC Access Method class declaration that send */
|
||||
/* commands to be executed by other DB JDBC drivers. */
|
||||
/***********************************************************************/
|
||||
class TDBXJDC : public TDBJDBC {
|
||||
friend class JSRCCOL;
|
||||
friend class JDBConn;
|
||||
public:
|
||||
// Constructors
|
||||
TDBXJDC(PJDBCDEF tdp = NULL);
|
||||
|
||||
// Implementation
|
||||
virtual AMT GetAmType(void) {return TYPE_AM_XDBC;}
|
||||
|
||||
// Methods
|
||||
//virtual int GetRecpos(void);
|
||||
//virtual PSZ GetFile(PGLOBAL g);
|
||||
//virtual void SetFile(PGLOBAL g, PSZ fn);
|
||||
//virtual void ResetSize(void);
|
||||
//virtual int GetAffectedRows(void) {return AftRows;}
|
||||
//virtual PSZ GetServer(void) {return "JDBC";}
|
||||
|
||||
// Database routines
|
||||
virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n);
|
||||
//virtual int GetProgMax(PGLOBAL g);
|
||||
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:
|
||||
// Internal functions
|
||||
PCMD MakeCMD(PGLOBAL g);
|
||||
//bool BindParameters(PGLOBAL g);
|
||||
|
||||
// Members
|
||||
PCMD Cmdlist; // The commands to execute
|
||||
char *Cmdcol; // The name of the Xsrc command column
|
||||
int Mxr; // Maximum errors before closing
|
||||
int Nerr; // Number of errors so far
|
||||
}; // end of class TDBXJDC
|
||||
|
||||
/***********************************************************************/
|
||||
/* Used by table in source execute mode. */
|
||||
/***********************************************************************/
|
||||
class JSRCCOL : public JDBCCOL {
|
||||
friend class TDBXJDC;
|
||||
public:
|
||||
// Constructors
|
||||
JSRCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "JDBC");
|
||||
|
||||
// Implementation
|
||||
//virtual int GetAmType(void) {return TYPE_AM_JDBC;}
|
||||
|
||||
// Methods
|
||||
virtual void ReadColumn(PGLOBAL g);
|
||||
virtual void WriteColumn(PGLOBAL g);
|
||||
// void Print(PGLOBAL g, FILE *, uint);
|
||||
|
||||
protected:
|
||||
// Members
|
||||
char *Buffer; // To get returned message
|
||||
int Flag; // Column content desc
|
||||
}; // end of class JSRCCOL
|
||||
|
||||
/***********************************************************************/
|
||||
/* This is the class declaration for the Drivers catalog table. */
|
||||
/***********************************************************************/
|
||||
class TDBJDRV : public TDBCAT {
|
||||
public:
|
||||
// Constructor
|
||||
TDBJDRV(PJDBCDEF tdp) : TDBCAT(tdp) {Maxres = tdp->Maxres; Jpath = tdp->Jpath;}
|
||||
|
||||
protected:
|
||||
// Specific routines
|
||||
virtual PQRYRES GetResult(PGLOBAL g);
|
||||
|
||||
// Members
|
||||
int Maxres; // Returned lines limit
|
||||
char *Jpath; // Java class path
|
||||
}; // end of class TDBJDRV
|
||||
|
||||
/***********************************************************************/
|
||||
/* This is the class declaration for the tables catalog table. */
|
||||
/***********************************************************************/
|
||||
class TDBJTB : public TDBJDRV {
|
||||
public:
|
||||
// Constructor
|
||||
TDBJTB(PJDBCDEF tdp);
|
||||
|
||||
protected:
|
||||
// Specific routines
|
||||
virtual PQRYRES GetResult(PGLOBAL g);
|
||||
|
||||
// Members
|
||||
char *Jpath; // Points to Java classpath
|
||||
char *Schema; // Points to schema name or NULL
|
||||
char *Tab; // Points to JDBC table name or pattern
|
||||
char *Tabtype; // Points to JDBC table type
|
||||
JDBCPARM Ops; // Additional parameters
|
||||
}; // end of class TDBJTB
|
||||
|
||||
/***********************************************************************/
|
||||
/* This is the class declaration for the columns catalog table. */
|
||||
/***********************************************************************/
|
||||
class TDBJDBCL : public TDBJTB {
|
||||
public:
|
||||
// Constructor
|
||||
TDBJDBCL(PJDBCDEF tdp) : TDBJTB(tdp) {}
|
||||
|
||||
protected:
|
||||
// Specific routines
|
||||
virtual PQRYRES GetResult(PGLOBAL g);
|
||||
|
||||
// No additional Members
|
||||
}; // end of class TDBJCL
|
||||
|
||||
#if 0
|
||||
/***********************************************************************/
|
||||
/* This is the class declaration for the Data Sources catalog table. */
|
||||
/***********************************************************************/
|
||||
class TDBJSRC : public TDBJDRV {
|
||||
public:
|
||||
// Constructor
|
||||
TDBJSRC(PJDBCDEF tdp) : TDBJDRV(tdp) {}
|
||||
|
||||
protected:
|
||||
// Specific routines
|
||||
virtual PQRYRES GetResult(PGLOBAL g);
|
||||
|
||||
// No additional Members
|
||||
}; // end of class TDBJSRC
|
||||
#endif // 0
|
||||
|
||||
#endif // !NJDBC
|
||||
@@ -19,7 +19,7 @@
|
||||
/* --------------- */
|
||||
/* TABMYSQL.CPP - Source code */
|
||||
/* PLGDBSEM.H - DB application declaration file */
|
||||
/* TABMYSQL.H - TABODBC classes declaration file */
|
||||
/* TABMYSQL.H - TABMYSQL classes declaration file */
|
||||
/* GLOBAL.H - Global declaration file */
|
||||
/* */
|
||||
/* REQUIRED LIBRARIES: */
|
||||
|
||||
@@ -97,8 +97,8 @@ ODBCDEF::ODBCDEF(void)
|
||||
{
|
||||
Connect = Tabname = Tabschema = Username = Password = NULL;
|
||||
Tabcat = Srcdef = Qchar = Qrystr = Sep = NULL;
|
||||
Catver = Options = Cto = Qto = Quoted = Maxerr = Maxres = 0;
|
||||
Scrollable = Memory = Xsrc = UseCnc = false;
|
||||
Catver = Options = Cto = Qto = Quoted = Maxerr = Maxres = Memory = 0;
|
||||
Scrollable = Xsrc = UseCnc = false;
|
||||
} // end of ODBCDEF constructor
|
||||
|
||||
/***********************************************************************/
|
||||
@@ -1009,7 +1009,7 @@ bool TDBODBC::SetRecpos(PGLOBAL g, int recpos)
|
||||
} // end of SetRecpos
|
||||
|
||||
/***********************************************************************/
|
||||
/* Data Base indexed read routine for MYSQL access method. */
|
||||
/* Data Base indexed read routine for ODBC access method. */
|
||||
/***********************************************************************/
|
||||
bool TDBODBC::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr)
|
||||
{
|
||||
@@ -1028,7 +1028,7 @@ bool TDBODBC::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr)
|
||||
|
||||
return false;
|
||||
} else {
|
||||
if (To_Def->GetHandler()->MakeKeyWhere(g, Query, op, c, kr))
|
||||
if (hc->MakeKeyWhere(g, Query, op, c, kr))
|
||||
return true;
|
||||
|
||||
if (To_CondFil) {
|
||||
|
||||
Reference in New Issue
Block a user