From 16893bc076dffb0b383d5f5e2b64fae8535bd10a Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Tue, 8 Apr 2014 11:15:08 +0200 Subject: [PATCH 1/3] - Add index read previous capacity. modified: storage/connect/ha_connect.cc storage/connect/ha_connect.h storage/connect/xindex.cpp - Optimize retrieving numeric values in scan_record. Was previously translating numeric values to character representation back and forth. modified: storage/connect/ha_connect.cc storage/connect/mysql-test/connect/r/xml.result - Modify Pivot table creation to avoid reading the entire source table when making columns from Discovery. MDEV-6024 modified: storage/connect/tabpivot.cpp --- storage/connect/ha_connect.cc | 71 ++++++++-------- storage/connect/ha_connect.h | 6 +- storage/connect/myconn.cpp | 2 +- .../connect/mysql-test/connect/r/xml.result | 3 + storage/connect/tabpivot.cpp | 82 +++++++++++++------ storage/connect/xindex.cpp | 15 ++-- 6 files changed, 110 insertions(+), 69 deletions(-) diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 571cb246f64..fa4c7672f99 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -635,8 +635,8 @@ ulonglong ha_connect::table_flags() const { ulonglong flags= HA_CAN_VIRTUAL_COLUMNS | HA_REC_NOT_IN_SEQ | HA_NO_AUTO_INCREMENT | HA_NO_PREFIX_CHAR_KEYS | - HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE | - HA_PARTIAL_COLUMN_READ | +// HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE | + HA_PARTIAL_COLUMN_READ | HA_FILE_BASED | // HA_NULL_IN_KEY | not implemented yet // HA_FAST_KEY_READ | causes error when sorting (???) HA_NO_TRANSACTIONS | HA_DUPLICATE_KEY_NOT_IN_ORDER | @@ -647,9 +647,6 @@ ulonglong ha_connect::table_flags() const if (pos) { TABTYPE type= hp->GetRealType(pos); - if (IsFileType(type)) - flags|= HA_FILE_BASED; - if (IsExactType(type)) flags|= (HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT); @@ -1407,8 +1404,9 @@ int ha_connect::MakeRecord(char *buf) } // endif colp value= colp->GetValue(); + p= NULL; - // All this could be better optimized + // All this was better optimized if (!value->IsNull()) { switch (value->GetType()) { case TYPE_DATE: @@ -1433,39 +1431,37 @@ int ha_connect::MakeRecord(char *buf) // Get date in the format required by MySQL fields value->FormatValue(sdvalout, fmt); p= sdvalout->GetCharValue(); - break; - case TYPE_DOUBLE: - p= NULL; + rc= fp->store(p, strlen(p), charset, CHECK_FIELD_WARN); break; case TYPE_STRING: - // Passthru - default: + case TYPE_DECIM: p= value->GetCharString(val); + charset= tdbp->data_charset(); + rc= fp->store(p, strlen(p), charset, CHECK_FIELD_WARN); + break; + case TYPE_DOUBLE: + rc= fp->store(value->GetFloatValue()); + break; + default: + rc= fp->store(value->GetBigintValue(), value->IsUnsigned()); break; } // endswitch Type - if (p) { - if (fp->store(p, strlen(p), charset, CHECK_FIELD_WARN)) { - // Avoid "error" on null fields - if (value->GetIntValue()) - rc= HA_ERR_WRONG_IN_RECORD; - - DBUG_PRINT("MakeRecord", ("%s", p)); - } // endif store - - } else - if (fp->store(value->GetFloatValue())) { -// rc= HA_ERR_WRONG_IN_RECORD; a Warning was ignored - char buf[128]; - THD *thd= ha_thd(); + // Store functions returns 1 on overflow and -1 on fatal error + if (rc > 0) { + char buf[128]; + THD *thd= ha_thd(); - sprintf(buf, "Out of range value for column '%s' at row %ld", - fp->field_name, - thd->get_stmt_da()->current_row_for_warning()); + sprintf(buf, "Out of range value %s for column '%s' at row %ld", + value->GetCharString(val), + fp->field_name, + thd->get_stmt_da()->current_row_for_warning()); - push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, buf); - DBUG_PRINT("MakeRecord", ("%s", value->GetCharString(val))); - } // endif store + push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, buf); + DBUG_PRINT("MakeRecord", ("%s", buf)); + rc= 0; + } else if (rc < 0) + rc= HA_ERR_WRONG_IN_RECORD; fp->set_notnull(); } else @@ -2455,7 +2451,6 @@ int ha_connect::index_next(uchar *buf) } // end of index_next -#ifdef NOT_USED /** @brief Used to read backwards through the index. @@ -2463,9 +2458,15 @@ int ha_connect::index_next(uchar *buf) int ha_connect::index_prev(uchar *buf) { DBUG_ENTER("ha_connect::index_prev"); - DBUG_RETURN(HA_ERR_WRONG_COMMAND); -} -#endif // NOT_USED + int rc; + + if (indexing > 0) { + rc= ReadIndexed(buf, OP_PREV); + } else + rc= HA_ERR_WRONG_COMMAND; + + DBUG_RETURN(rc); +} // end of index_prev /** diff --git a/storage/connect/ha_connect.h b/storage/connect/ha_connect.h index 79f4a2e734a..3629d15a0a5 100644 --- a/storage/connect/ha_connect.h +++ b/storage/connect/ha_connect.h @@ -241,8 +241,8 @@ public: */ ulong index_flags(uint inx, uint part, bool all_parts) const { - return HA_READ_NEXT | HA_READ_RANGE | HA_READ_ORDER - | HA_KEYREAD_ONLY | HA_KEY_SCAN_NOT_ROR; + return HA_READ_NEXT | HA_READ_RANGE | HA_READ_ORDER | + HA_READ_PREV | HA_KEYREAD_ONLY | HA_KEY_SCAN_NOT_ROR; } // end of index_flags /** @brief @@ -405,7 +405,7 @@ const char *GetValStr(OPVAL vop, bool neg); We implement this in ha_connect.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ -//int index_prev(uchar *buf); +int index_prev(uchar *buf); /** @brief We implement this in ha_connect.cc. It's not an obligatory method; diff --git a/storage/connect/myconn.cpp b/storage/connect/myconn.cpp index e8b72cd3643..8218c9d6c6e 100644 --- a/storage/connect/myconn.cpp +++ b/storage/connect/myconn.cpp @@ -365,7 +365,7 @@ int MYSQLC::Open(PGLOBAL g, const char *host, const char *db, int pt) { const char *pipe = NULL; - uint cto = 60, nrt = 120; + uint cto = 6000, nrt = 12000; m_DB = mysql_init(NULL); diff --git a/storage/connect/mysql-test/connect/r/xml.result b/storage/connect/mysql-test/connect/r/xml.result index 4768573dc7c..5018eec47fc 100644 --- a/storage/connect/mysql-test/connect/r/xml.result +++ b/storage/connect/mysql-test/connect/r/xml.result @@ -326,6 +326,9 @@ Warnings: Level Warning Code 1366 Message Incorrect string value: '\xC3\x81\xC3\x82\xC3\x83...' for column 'c' at row 1 +Level Warning +Code 1105 +Message Out of range value ÁÂÃÄÅÆÇ for column 'c' at row 1 DROP TABLE t1; # # Testing Cyrillic diff --git a/storage/connect/tabpivot.cpp b/storage/connect/tabpivot.cpp index b236d3c62cd..037a892dfe5 100644 --- a/storage/connect/tabpivot.cpp +++ b/storage/connect/tabpivot.cpp @@ -98,7 +98,8 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) char *query, *colname, buf[64]; int rc, ndif, nblin, w = 0; bool b = false; - PVAL valp; + PVAL valp; + PQRYRES qrp; PCOLRES *pcrp, crp, fncrp = NULL; // Save stack and allocation environment and prepare error return @@ -113,8 +114,8 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) if (!Tabsrc && Tabname) { // Locate the query - query = (char*)PlugSubAlloc(g, NULL, strlen(Tabname) + 16); - sprintf(query, "SELECT * FROM %s", Tabname); + query = (char*)PlugSubAlloc(g, NULL, strlen(Tabname) + 26); + sprintf(query, "SELECT * FROM `%s` LIMIT 1", Tabname); } else if (!Tabsrc) { strcpy(g->Message, MSG(SRC_TABLE_UNDEF)); return NULL; @@ -132,9 +133,8 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) goto err; // We must have a storage query to get pivot column values - Qryp = Myc.GetResult(g, true); - Myc.Close(); - b = false; + if (!(Qryp = Myc.GetResult(g, true))) + goto err; if (!Fncol) { for (crp = Qryp->Colresp; crp; crp = crp->Next) @@ -143,7 +143,7 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) if (!Fncol) { strcpy(g->Message, MSG(NO_DEF_FNCCOL)); - return NULL; + goto err; } // endif Fncol } // endif Fncol @@ -156,7 +156,7 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) if (!Picol) { strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); - return NULL; + goto err; } // endif Picol } // endif picol @@ -166,7 +166,7 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) if (!stricmp(Picol, crp->Name)) { if (crp->Nulls) { sprintf(g->Message, "Pivot column %s cannot be nullable", Picol); - return NULL; + goto err; } // endif Nulls Rblkp = crp->Kdata; @@ -179,31 +179,59 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) if (!Rblkp) { strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); - return NULL; + goto err; } else if (!fncrp) { strcpy(g->Message, MSG(NO_DEF_FNCCOL)); - return NULL; + goto err; } // endif - // Before calling sort, initialize all - nblin = Qryp->Nblin; + if (Tabsrc) { + Myc.Close(); + b = false; - Index.Size = nblin * sizeof(int); - Index.Sub = TRUE; // Should be small enough + // Before calling sort, initialize all + nblin = Qryp->Nblin; - if (!PlgDBalloc(g, NULL, Index)) - return NULL; + Index.Size = nblin * sizeof(int); + Index.Sub = TRUE; // Should be small enough - Offset.Size = (nblin + 1) * sizeof(int); - Offset.Sub = TRUE; // Should be small enough + if (!PlgDBalloc(g, NULL, Index)) + return NULL; - if (!PlgDBalloc(g, NULL, Offset)) - return NULL; + Offset.Size = (nblin + 1) * sizeof(int); + Offset.Sub = TRUE; // Should be small enough - ndif = Qsort(g, nblin); + if (!PlgDBalloc(g, NULL, Offset)) + return NULL; - if (ndif < 0) // error - return NULL; + ndif = Qsort(g, nblin); + + if (ndif < 0) // error + return NULL; + + } else { + // The query was limited, we must get pivot column values + query = (char*)PlugSubAlloc(g, NULL, 0); + sprintf(query, "SELECT DISTINCT `%s` FROM `%s`", Picol, Tabname); + PlugSubAlloc(g, NULL, strlen(query) + 1); + Myc.FreeResult(); + + // Send the source command to MySQL + if (Myc.ExecSQL(g, query, &w) == RC_FX) + goto err; + + // We must have a storage query to get pivot column values + if (!(qrp = Myc.GetResult(g, true))) + goto err; + + Myc.Close(); + b = false; + + // Get the column list + crp = qrp->Colresp; + Rblkp = crp->Kdata; + ndif = qrp->Nblin; + } // endif Tabsrc // Allocate the Value used to retieve column names if (!(valp = AllocateValue(g, Rblkp->GetType(), @@ -220,7 +248,11 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) crp = fncrp; // Get the value that will be the generated column name - valp->SetValue_pvblk(Rblkp, Pex[Pof[i]]); + if (Tabsrc) + valp->SetValue_pvblk(Rblkp, Pex[Pof[i]]); + else + valp->SetValue_pvblk(Rblkp, i); + colname = valp->GetCharString(buf); crp->Name = (char*)PlugSubAlloc(g, NULL, strlen(colname) + 1); strcpy(crp->Name, colname); diff --git a/storage/connect/xindex.cpp b/storage/connect/xindex.cpp index 38917f1d5df..1e29f687f38 100755 --- a/storage/connect/xindex.cpp +++ b/storage/connect/xindex.cpp @@ -1631,7 +1631,7 @@ int XINDEX::Fetch(PGLOBAL g) switch (Op) { case OP_NEXT: // Read next if (NextVal(false)) - return -1; // End of indexed file + return -1; // End of indexed file break; case OP_FIRST: // Read first @@ -1648,7 +1648,7 @@ int XINDEX::Fetch(PGLOBAL g) if (NextVal(true)) { Op = OP_EQ; - return -2; // no more equal values + return -2; // no more equal values } // endif NextVal break; @@ -1656,9 +1656,9 @@ int XINDEX::Fetch(PGLOBAL g) // while (!NextVal(true)) ; // if (Cur_K >= Num_K) -// return -1; // End of indexed file +// return -1; // End of indexed file if (NextValDif()) - return -1; // End of indexed file + return -1; // End of indexed file break; case OP_FSTDIF: // Read first diff @@ -1667,12 +1667,17 @@ int XINDEX::Fetch(PGLOBAL g) Op = (Mul || Nval < Nk) ? OP_NXTDIF : OP_NEXT; break; - case OP_LAST: // Read last key + case OP_LAST: // Read last key for (Cur_K = Num_K - 1, kp = To_KeyCol; kp; kp = kp->Next) kp->Val_K = kp->Kblp->GetNval() - 1; Op = OP_NEXT; break; + case OP_PREV: // Read previous + if (PrevVal()) + return -1; // End of indexed file + + break; default: // Should be OP_EQ // if (Tbxp->Key_Rank < 0) { /***************************************************************/ From be1ee90b4412fb0b111c2090ee7b1baa3490e0f7 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Tue, 8 Apr 2014 18:18:02 +0200 Subject: [PATCH 2/3] - Add the "skipcol" option to Pivot tables. modified: storage/connect/ha_connect.cc storage/connect/tabpivot.cpp storage/connect/tabpivot.h --- storage/connect/ha_connect.cc | 7 +++-- storage/connect/tabpivot.cpp | 56 +++++++++++++++++++++++++++-------- storage/connect/tabpivot.h | 14 +++++---- 3 files changed, 56 insertions(+), 21 deletions(-) diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index fa4c7672f99..e91bfd9dfc6 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -3916,7 +3916,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, char v, spc= ',', qch= 0; const char *fncn= "?"; const char *user, *fn, *db, *host, *pwd, *sep, *tbl, *src; - const char *col, *ocl, *rnk, *pic, *fcl; + const char *col, *ocl, *rnk, *pic, *fcl, *skc; char *tab, *dsn, *shm; #if defined(WIN32) char *nsp= NULL, *cls= NULL; @@ -3941,7 +3941,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, if (!g) return HA_ERR_INTERNAL_ERROR; - user= host= pwd= tbl= src= col= ocl= pic= fcl= rnk= dsn= NULL; + user= host= pwd= tbl= src= col= ocl= pic= fcl= skc= rnk= dsn= NULL; // Get the useful create options ttp= GetTypeID(topt->type); @@ -3967,6 +3967,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, ocl= GetListOption(g, "occurcol", topt->oplist, NULL); pic= GetListOption(g, "pivotcol", topt->oplist, NULL); fcl= GetListOption(g, "fnccol", topt->oplist, NULL); + skc= GetListOption(g, "skipcol", topt->oplist, NULL); rnk= GetListOption(g, "rankcol", topt->oplist, NULL); pwd= GetListOption(g, "password", topt->oplist); #if defined(WIN32) @@ -4229,7 +4230,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, break; case TAB_PIVOT: - qrp= PivotColumns(g, tab, src, pic, fcl, host, db, user, pwd, port); + qrp= PivotColumns(g, tab, src, pic, fcl, skc, host, db, user, pwd, port); break; case TAB_OEM: qrp= OEMColumns(g, topt, tab, (char*)db, fnc == FNC_COL); diff --git a/storage/connect/tabpivot.cpp b/storage/connect/tabpivot.cpp index 037a892dfe5..ddfcd54a899 100644 --- a/storage/connect/tabpivot.cpp +++ b/storage/connect/tabpivot.cpp @@ -58,11 +58,11 @@ extern "C" int trace; /***********************************************************************/ PQRYRES PivotColumns(PGLOBAL g, const char *tab, const char *src, const char *picol, const char *fncol, - const char *host, const char *db, - const char *user, const char *pwd, - int port) + const char *skcol, const char *host, + const char *db, const char *user, + const char *pwd, int port) { - PIVAID pvd(tab, src, picol, fncol, host, db, user, pwd, port); + PIVAID pvd(tab, src, picol, fncol, skcol, host, db, user, pwd, port); return pvd.MakePivotColumns(g); } // end of PivotColumns @@ -72,10 +72,10 @@ PQRYRES PivotColumns(PGLOBAL g, const char *tab, const char *src, /***********************************************************************/ /* PIVAID constructor. */ /***********************************************************************/ -PIVAID::PIVAID(const char *tab, const char *src, const char *picol, - const char *fncol, const char *host, const char *db, - const char *user, const char *pwd, int port) - : CSORT(false) +PIVAID::PIVAID(const char *tab, const char *src, const char *picol, + const char *fncol, const char *skcol, const char *host, + const char *db, const char *user, const char *pwd, + int port) : CSORT(false) { Host = (char*)host; User = (char*)user; @@ -86,16 +86,30 @@ PIVAID::PIVAID(const char *tab, const char *src, const char *picol, Tabsrc = (char*)src; Picol = (char*)picol; Fncol = (char*)fncol; + Skcol = (char*)skcol; Rblkp = NULL; Port = (port) ? port : GetDefaultPort(); } // end of PIVAID constructor +/***********************************************************************/ +/* Skip columns that are in the skipped column list. */ +/***********************************************************************/ +bool PIVAID::SkipColumn(PCOLRES crp, char *skc) + { + if (skc) + for (char *p = skc; *p; p += (strlen(p) + 1)) + if (!stricmp(crp->Name, p)) + return true; + + return false; + } // end of SkipColumn + /***********************************************************************/ /* Make the Pivot table column list. */ /***********************************************************************/ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) { - char *query, *colname, buf[64]; + char *p, *query, *colname, *skc, buf[64]; int rc, ndif, nblin, w = 0; bool b = false; PVAL valp; @@ -112,6 +126,21 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) goto err; } // endif rc + // Are there columns to skip? + if (Skcol) { + uint n = strlen(Skcol); + + skc = (char*)PlugSubAlloc(g, NULL, n + 2); + strcpy(skc, Skcol); + skc[n + 1] = 0; + + // Replace ; by nulls in skc + for (p = strchr(skc, ';'); p; p = strchr(p, ';')) + *p++ = 0; + + } else + skc = NULL; + if (!Tabsrc && Tabname) { // Locate the query query = (char*)PlugSubAlloc(g, NULL, strlen(Tabname) + 26); @@ -138,7 +167,7 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) if (!Fncol) { for (crp = Qryp->Colresp; crp; crp = crp->Next) - if (!Picol || stricmp(Picol, crp->Name)) + if ((!Picol || stricmp(Picol, crp->Name)) && !SkipColumn(crp, skc)) Fncol = crp->Name; if (!Fncol) { @@ -151,7 +180,7 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) if (!Picol) { // Find default Picol as the last one not equal to Fncol for (crp = Qryp->Colresp; crp; crp = crp->Next) - if (stricmp(Fncol, crp->Name)) + if (stricmp(Fncol, crp->Name) && !SkipColumn(crp, skc)) Picol = crp->Name; if (!Picol) { @@ -163,7 +192,10 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) // Prepare the column list for (pcrp = &Qryp->Colresp; crp = *pcrp; ) - if (!stricmp(Picol, crp->Name)) { + if (SkipColumn(crp, skc)) { + // Ignore this column + *pcrp = crp->Next; + } else if (!stricmp(Picol, crp->Name)) { if (crp->Nulls) { sprintf(g->Message, "Pivot column %s cannot be nullable", Picol); goto err; diff --git a/storage/connect/tabpivot.h b/storage/connect/tabpivot.h index 0b5bf50d13b..c7248ee2e1d 100644 --- a/storage/connect/tabpivot.h +++ b/storage/connect/tabpivot.h @@ -18,12 +18,13 @@ class PIVAID : public CSORT { friend class SRCCOL; public: // Constructor - PIVAID(const char *tab, const char *src, const char *picol, - const char *fncol, const char *host, const char *db, - const char *user, const char *pwd, int port); + PIVAID(const char *tab, const char *src, const char *picol, + const char *fncol, const char *skcol, const char *host, + const char *db, const char *user, const char *pwd, int port); // Methods PQRYRES MakePivotColumns(PGLOBAL g); + bool SkipColumn(PCOLRES crp, char *skc); // The sorting function virtual int Qcompare(int *, int *); @@ -40,6 +41,7 @@ class PIVAID : public CSORT { char *Tabsrc; // SQL of source table char *Picol; // Pivot column name char *Fncol; // Function column name + char *Skcol; // Skipped columns PVBLK Rblkp; // The value block of the pivot column int Port; // MySQL port number }; // end of class PIVAID @@ -191,6 +193,6 @@ class SRCCOL : public PRXCOL { PQRYRES PivotColumns(PGLOBAL g, const char *tab, const char *src, const char *picol, const char *fncol, - const char *host, const char *db, - const char *user, const char *pwd, - int port); + const char *skcol, const char *host, + const char *db, const char *user, + const char *pwd, int port); From 213ecbbb4f3d252ba2d653eacf756e123821c41a Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Mon, 14 Apr 2014 14:26:48 +0200 Subject: [PATCH 3/3] - In info, the file length sometimes could not be caculated because the catalog data path had not been set. This was added into ha_connect::info. modified: storage/connect/ha_connect.cc - All the functions querying table options could return information from the wrong table when several CONNECT tables were used in the same query (for instance joined together) This was because they belonged to the catalog class that is shared between all tables in the same query. They have been moved from the catalog class to the TABDEF/RELDEF class that is attached to each table. This was a major potential bug. modified: storage/connect/catalog.h storage/connect/filamvct.cpp storage/connect/filamzip.cpp storage/connect/mycat.cc storage/connect/mycat.h storage/connect/reldef.cpp storage/connect/reldef.h storage/connect/tabdos.cpp storage/connect/tabfmt.cpp storage/connect/tabmul.cpp storage/connect/tabmysql.cpp storage/connect/taboccur.cpp storage/connect/tabodbc.cpp storage/connect/tabpivot.cpp storage/connect/tabsys.cpp storage/connect/tabtbl.cpp storage/connect/tabutil.cpp storage/connect/tabvct.cpp storage/connect/tabwmi.cpp storage/connect/tabxcl.cpp storage/connect/tabxml.cpp storage/connect/xindex.cpp - Prepare indexing of MYSQL/ODBC tables (as does FEDERATED) (Not implemented yet) modified: storage/connect/ha_connect.cc storage/connect/ha_connect.h storage/connect/mycat.cc storage/connect/mycat.h - Typo modified: storage/connect/plgdbutl.cpp --- storage/connect/catalog.h | 10 -- storage/connect/filamvct.cpp | 5 +- storage/connect/filamzip.cpp | 10 +- storage/connect/ha_connect.cc | 78 +++++---- storage/connect/ha_connect.h | 2 +- storage/connect/mycat.cc | 308 ++++------------------------------ storage/connect/mycat.h | 9 +- storage/connect/plgdbutl.cpp | 2 +- storage/connect/reldef.cpp | 297 ++++++++++++++++++++++++++++++-- storage/connect/reldef.h | 18 +- storage/connect/tabdos.cpp | 42 ++--- storage/connect/tabfmt.cpp | 12 +- storage/connect/tabmul.cpp | 6 +- storage/connect/tabmysql.cpp | 56 +++---- storage/connect/taboccur.cpp | 6 +- storage/connect/tabodbc.cpp | 30 ++-- storage/connect/tabpivot.cpp | 18 +- storage/connect/tabsys.cpp | 6 +- storage/connect/tabtbl.cpp | 12 +- storage/connect/tabutil.cpp | 6 +- storage/connect/tabvct.cpp | 10 +- storage/connect/tabwmi.cpp | 6 +- storage/connect/tabxcl.cpp | 6 +- storage/connect/tabxml.cpp | 42 ++--- storage/connect/xindex.cpp | 2 +- 25 files changed, 517 insertions(+), 482 deletions(-) diff --git a/storage/connect/catalog.h b/storage/connect/catalog.h index a4fba7ae920..6e6cf86fc87 100644 --- a/storage/connect/catalog.h +++ b/storage/connect/catalog.h @@ -71,16 +71,6 @@ class DllExport CATALOG { // Methods virtual void Reset(void) {} virtual void SetDataPath(PGLOBAL g, const char *path) {} - virtual bool GetBoolCatInfo(PSZ what, bool bdef) {return bdef;} - virtual bool SetIntCatInfo(PSZ what, int ival) {return false;} - virtual int GetIntCatInfo(PSZ what, int idef) {return idef;} - virtual int GetSizeCatInfo(PSZ what, PSZ sdef) {return 0;} - virtual int GetCharCatInfo(PSZ what, PSZ sdef, char *buf, int size) - {strncpy(buf, sdef, size); return size;} - virtual char *GetStringCatInfo(PGLOBAL g, PSZ what, PSZ sdef) - {return sdef;} - virtual int GetColCatInfo(PGLOBAL g, PTABDEF defp) {return -1;} - virtual bool GetIndexInfo(PGLOBAL g, PTABDEF defp) {return true;} virtual bool CheckName(PGLOBAL g, char *name) {return true;} virtual bool ClearName(PGLOBAL g, PSZ name) {return true;} virtual PRELDEF MakeOneTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am) {return NULL;} diff --git a/storage/connect/filamvct.cpp b/storage/connect/filamvct.cpp index ffd46c32231..e6c8bf23b50 100755 --- a/storage/connect/filamvct.cpp +++ b/storage/connect/filamvct.cpp @@ -1093,13 +1093,12 @@ bool VCTFAM::ResetTableSize(PGLOBAL g, int block, int last) // Update catalog values for Block and Last PVCTDEF defp = (PVCTDEF)Tdbp->GetDef(); LPCSTR name = Tdbp->GetName(); - PCATLG cat = PlgGetCatalog(g); defp->SetBlock(Block); defp->SetLast(Last); - if (!cat->SetIntCatInfo("Blocks", Block) || - !cat->SetIntCatInfo("Last", Last)) { + if (!defp->SetIntCatInfo("Blocks", Block) || + !defp->SetIntCatInfo("Last", Last)) { sprintf(g->Message, MSG(UPDATE_ERROR), "Header"); rc = true; } // endif diff --git a/storage/connect/filamzip.cpp b/storage/connect/filamzip.cpp index 9d0ffab32d9..0ec9e65c17e 100644 --- a/storage/connect/filamzip.cpp +++ b/storage/connect/filamzip.cpp @@ -543,13 +543,12 @@ int ZBKFAM::DeleteRecords(PGLOBAL g, int irc) if (irc == RC_EF) { LPCSTR name = Tdbp->GetName(); PDOSDEF defp = (PDOSDEF)Tdbp->GetDef(); - PCATLG cat = PlgGetCatalog(g); defp->SetBlock(0); defp->SetLast(Nrec); - if (!cat->SetIntCatInfo("Blocks", 0) || - !cat->SetIntCatInfo("Last", 0)) { + if (!defp->SetIntCatInfo("Blocks", 0) || + !defp->SetIntCatInfo("Last", 0)) { sprintf(g->Message, MSG(UPDATE_ERROR), "Header"); return RC_FX; } else @@ -568,7 +567,6 @@ void ZBKFAM::CloseTableFile(PGLOBAL g) int rc = RC_OK; if (Tdbp->GetMode() == MODE_INSERT) { - PCATLG cat = PlgGetCatalog(g); LPCSTR name = Tdbp->GetName(); PDOSDEF defp = (PDOSDEF)Tdbp->GetDef(); @@ -587,8 +585,8 @@ void ZBKFAM::CloseTableFile(PGLOBAL g) if (rc != RC_FX) { defp->SetBlock(Block); defp->SetLast(Last); - cat->SetIntCatInfo("Blocks", Block); - cat->SetIntCatInfo("Last", Last); + defp->SetIntCatInfo("Blocks", Block); + defp->SetIntCatInfo("Last", Last); } // endif gzclose(Zfile); diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index e91bfd9dfc6..79ee89e854b 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -619,10 +619,16 @@ static PGLOBAL GetPlug(THD *thd, PCONNECT& lxp) /****************************************************************************/ TABTYPE ha_connect::GetRealType(PTOS pos) { - TABTYPE type= GetTypeID(pos->type); + TABTYPE type; + + if (pos || (pos= GetTableOptionStruct(table))) { + type= GetTypeID(pos->type); - if (type == TAB_UNDEF) - type= pos->srcdef ? TAB_MYSQL : pos->tabname ? TAB_PRX : TAB_DOS; + if (type == TAB_UNDEF) + type= pos->srcdef ? TAB_MYSQL : pos->tabname ? TAB_PRX : TAB_DOS; + + } else + type= TAB_UNDEF; return type; } // end of GetRealType @@ -2802,12 +2808,21 @@ int ha_connect::info(uint flag) if (!valid_info) { // tdbp must be available to get updated info if (xp->CheckQuery(valid_query_id) || !tdbp) { + PDBUSER dup= PlgGetUser(g); + PCATLG cat= (dup) ? dup->Catalog : NULL; + if (xmod == MODE_ANY || xmod == MODE_ALTER) { // Pure info, not a query pure= true; xp->CheckCleanup(); } // endif xmod + // This is necessary for getting file length + if (cat && table) + cat->SetDataPath(g, table->s->db.str); + else + return HA_ERR_INTERNAL_ERROR; // Should never happen + tdbp= GetTDB(g); } // endif tdbp @@ -4796,7 +4811,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, // Get the index definitions if (xdp= GetIndexInfo()) { - if (IsTypeIndexable(type)) { + if (GetIndexType(type) == 1) { PDBUSER dup= PlgGetUser(g); PCATLG cat= (dup) ? dup->Catalog : NULL; @@ -4812,7 +4827,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, } // endif cat - } else { + } else if (!GetIndexType(type)) { sprintf(g->Message, "Table type %s is not indexable", options->type); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); rc= HA_ERR_UNSUPPORTED; @@ -5106,35 +5121,36 @@ ha_connect::check_if_supported_inplace_alter(TABLE *altered_table, if (ha_alter_info->handler_flags & index_operations || !SameString(altered_table, "optname") || !SameBool(altered_table, "sepindex")) { - if (!IsTypeIndexable(type)) { + if (GetIndexType(type) == 1) { + g->Xchk= new(g) XCHK; + PCHK xcp= (PCHK)g->Xchk; + + xcp->oldpix= GetIndexInfo(table->s); + xcp->newpix= GetIndexInfo(altered_table->s); + xcp->oldsep= GetBooleanOption("sepindex", false); + xcp->oldsep= xcp->SetName(g, GetStringOption("optname")); + tshp= altered_table->s; + xcp->newsep= GetBooleanOption("sepindex", false); + xcp->newsep= xcp->SetName(g, GetStringOption("optname")); + tshp= NULL; + + if (xtrace && g->Xchk) + htrc( + "oldsep=%d newsep=%d oldopn=%s newopn=%s oldpix=%p newpix=%p\n", + xcp->oldsep, xcp->newsep, + SVP(xcp->oldopn), SVP(xcp->newopn), + xcp->oldpix, xcp->newpix); + + if (sqlcom == SQLCOM_ALTER_TABLE) + idx= true; + else + DBUG_RETURN(HA_ALTER_INPLACE_EXCLUSIVE_LOCK); + + } else if (!GetIndexType(type)) { sprintf(g->Message, "Table type %s is not indexable", oldopt->type); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); DBUG_RETURN(HA_ALTER_ERROR); - } // endif Indexable - - g->Xchk= new(g) XCHK; - PCHK xcp= (PCHK)g->Xchk; - - xcp->oldpix= GetIndexInfo(table->s); - xcp->newpix= GetIndexInfo(altered_table->s); - xcp->oldsep= GetBooleanOption("sepindex", false); - xcp->oldsep= xcp->SetName(g, GetStringOption("optname")); - tshp= altered_table->s; - xcp->newsep= GetBooleanOption("sepindex", false); - xcp->newsep= xcp->SetName(g, GetStringOption("optname")); - tshp= NULL; - - if (xtrace && g->Xchk) - htrc( - "oldsep=%d newsep=%d oldopn=%s newopn=%s oldpix=%p newpix=%p\n", - xcp->oldsep, xcp->newsep, - SVP(xcp->oldopn), SVP(xcp->newopn), - xcp->oldpix, xcp->newpix); - - if (sqlcom == SQLCOM_ALTER_TABLE) - idx= true; - else - DBUG_RETURN(HA_ALTER_INPLACE_EXCLUSIVE_LOCK); + } // endif index type } // endif index operation diff --git a/storage/connect/ha_connect.h b/storage/connect/ha_connect.h index 3629d15a0a5..88e8de43ba6 100644 --- a/storage/connect/ha_connect.h +++ b/storage/connect/ha_connect.h @@ -165,7 +165,7 @@ public: // CONNECT Implementation static bool connect_init(void); static bool connect_end(void); - TABTYPE GetRealType(PTOS pos); + TABTYPE GetRealType(PTOS pos= NULL); char *GetStringOption(char *opname, char *sdef= NULL); PTOS GetTableOptionStruct(TABLE *table_arg); bool GetBooleanOption(char *opname, bool bdef); diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc index 909bccd8864..7a6f317526a 100644 --- a/storage/connect/mycat.cc +++ b/storage/connect/mycat.cc @@ -211,7 +211,7 @@ bool IsTypeNullable(TABTYPE type) } // end of IsTypeNullable /***********************************************************************/ -/* Return true for table types with fix length records. */ +/* Return true for indexable table by XINDEX. */ /***********************************************************************/ bool IsTypeFixed(TABTYPE type) { @@ -233,7 +233,7 @@ bool IsTypeFixed(TABTYPE type) } // end of IsTypeFixed /***********************************************************************/ -/* Return true for table types with fix length records. */ +/* Return true for table indexable by XINDEX. */ /***********************************************************************/ bool IsTypeIndexable(TABTYPE type) { @@ -257,6 +257,35 @@ bool IsTypeIndexable(TABTYPE type) return idx; } // end of IsTypeIndexable +/***********************************************************************/ +/* Return index type: 0 NO, 1 XINDEX, 2 REMOTE. */ +/***********************************************************************/ +int GetIndexType(TABTYPE type) + { + int xtyp; + + switch (type) { + case TAB_DOS: + case TAB_CSV: + case TAB_FMT: + case TAB_FIX: + case TAB_BIN: + case TAB_VEC: + case TAB_DBF: + xtyp= 1; + break; + case TAB_MYSQL: + case TAB_ODBC: +// xtyp= 2; Remote indexes not implemented yet +// break; + default: + xtyp= 0; + break; + } // endswitch type + + return xtyp; + } // end of GetIndexType + /***********************************************************************/ /* Get a unique enum catalog function ID. */ /***********************************************************************/ @@ -434,281 +463,6 @@ void MYCAT::SetPath(PGLOBAL g, LPCSTR *datapath, const char *path) } // end of SetDataPath -/***********************************************************************/ -/* This function sets an integer MYCAT information. */ -/***********************************************************************/ -bool MYCAT::SetIntCatInfo(PSZ what, int n) - { - return Hc->SetIntegerOption(what, n); - } // end of SetIntCatInfo - -/***********************************************************************/ -/* This function returns integer MYCAT information. */ -/***********************************************************************/ -int MYCAT::GetIntCatInfo(PSZ what, int idef) - { - int n= Hc->GetIntegerOption(what); - - return (n == NO_IVAL) ? idef : n; - } // end of GetIntCatInfo - -/***********************************************************************/ -/* This function returns Boolean MYCAT information. */ -/***********************************************************************/ -bool MYCAT::GetBoolCatInfo(PSZ what, bool bdef) - { - bool b= Hc->GetBooleanOption(what, bdef); - - return b; - } // end of GetBoolCatInfo - -/***********************************************************************/ -/* This function returns size catalog information. */ -/***********************************************************************/ -int MYCAT::GetSizeCatInfo(PSZ what, PSZ sdef) - { - char * s, c; - int i, n= 0; - - if (!(s= Hc->GetStringOption(what))) - s= sdef; - - if ((i= sscanf(s, " %d %c ", &n, &c)) == 2) - switch (toupper(c)) { - case 'M': - n *= 1024; - case 'K': - n *= 1024; - } // endswitch c - - return n; -} // end of GetSizeCatInfo - -/***********************************************************************/ -/* This function sets char MYCAT information in buf. */ -/***********************************************************************/ -int MYCAT::GetCharCatInfo(PSZ what, PSZ sdef, char *buf, int size) - { - char *s= Hc->GetStringOption(what); - - strncpy(buf, ((s) ? s : sdef), size); - return size; - } // end of GetCharCatInfo - -/***********************************************************************/ -/* This function returns string MYCAT information. */ -/* Default parameter is "*" to get the handler default. */ -/***********************************************************************/ -char *MYCAT::GetStringCatInfo(PGLOBAL g, PSZ what, PSZ sdef) - { - char *sval= NULL, *s= Hc->GetStringOption(what, sdef); - - if (s) { - sval= (char*)PlugSubAlloc(g, NULL, strlen(s) + 1); - strcpy(sval, s); - } else if (!stricmp(what, "filename")) { - // Return default file name - char *ftype= Hc->GetStringOption("Type", "*"); - int i, n; - - if (IsFileType(GetTypeID(ftype))) { - sval= (char*)PlugSubAlloc(g, NULL, strlen(Hc->GetTableName()) + 12); - strcat(strcpy(sval, Hc->GetTableName()), "."); - n= strlen(sval); - - // Fold ftype to lower case - for (i= 0; i < 12; i++) - if (!ftype[i]) { - sval[n+i]= 0; - break; - } else - sval[n+i]= tolower(ftype[i]); - - } // endif FileType - - } // endif s - - return sval; - } // end of GetStringCatInfo - -/***********************************************************************/ -/* This function returns column MYCAT information. */ -/***********************************************************************/ -int MYCAT::GetColCatInfo(PGLOBAL g, PTABDEF defp) - { - char *type= GetStringCatInfo(g, "Type", "*"); - int i, loff, poff, nof, nlg; - void *field= NULL; - TABTYPE tc; - PCOLDEF cdp, lcdp= NULL, tocols= NULL; - PCOLINFO pcf= (PCOLINFO)PlugSubAlloc(g, NULL, sizeof(COLINFO)); - - memset(pcf, 0, sizeof(COLINFO)); - - // Get a unique char identifier for type - tc= (defp->Catfunc == FNC_NO) ? GetTypeID(type) : TAB_PRX; - - // Take care of the column definitions - i= poff= nof= nlg= 0; - - // Offsets of HTML and DIR tables start from 0, DBF at 1 - loff= (tc == TAB_DBF) ? 1 : (tc == TAB_XML || tc == TAB_DIR) ? -1 : 0; - - while (true) { - // Default Offset depends on table type - switch (tc) { - case TAB_DOS: - case TAB_FIX: - case TAB_BIN: - case TAB_VEC: - case TAB_DBF: - poff= loff + nof; // Default next offset - nlg= max(nlg, poff); // Default lrecl - break; - case TAB_CSV: - case TAB_FMT: - nlg+= nof; - case TAB_DIR: - case TAB_XML: - poff= loff + 1; - break; - case TAB_INI: - case TAB_MAC: - case TAB_TBL: - case TAB_XCL: - case TAB_OCCUR: - case TAB_PRX: - case TAB_OEM: - poff = 0; // Offset represents an independant flag - break; - default: // VCT PLG ODBC MYSQL WMI... - poff = 0; // NA - break; - } // endswitch tc - -// do { - field= Hc->GetColumnOption(g, field, pcf); -// } while (field && (*pcf->Name =='*' /*|| pcf->Flags & U_VIRTUAL*/)); - - if (tc == TAB_DBF && pcf->Type == TYPE_DATE && !pcf->Datefmt) { - // DBF date format defaults to 'YYYMMDD' - pcf->Datefmt= "YYYYMMDD"; - pcf->Length= 8; - } // endif tc - - if (!field) - break; - - // Allocate the column description block - cdp= new(g) COLDEF; - - if ((nof= cdp->Define(g, NULL, pcf, poff)) < 0) - return -1; // Error, probably unhandled type - else if (nof) - loff= cdp->GetOffset(); - - switch (tc) { - case TAB_VEC: - cdp->SetOffset(0); // Not to have shift - case TAB_BIN: - // BIN/VEC are packed by default - if (nof) - // Field width is the internal representation width - // that can also depend on the column format - switch (cdp->Fmt ? *cdp->Fmt : 'X') { - case 'C': break; - case 'R': - case 'F': - case 'L': - case 'I': nof= 4; break; - case 'D': nof= 8; break; - case 'S': nof= 2; break; - case 'T': nof= 1; break; - default: nof= cdp->Clen; - } // endswitch Fmt - - default: - break; - } // endswitch tc - - if (lcdp) - lcdp->SetNext(cdp); - else - tocols= cdp; - - lcdp= cdp; - i++; - } // endwhile - - // Degree is the the number of defined columns (informational) - if (i != defp->GetDegree()) - defp->SetDegree(i); - - if (defp->GetDefType() == TYPE_AM_DOS) { - int ending, recln= 0; - PDOSDEF ddp= (PDOSDEF)defp; - - // Was commented because sometimes ending is 0 even when - // not specified (for instance if quoted is specified) -// if ((ending= Hc->GetIntegerOption("Ending")) < 0) { - if ((ending= Hc->GetIntegerOption("Ending")) <= 0) { -#if defined(WIN32) - ending= 2; -#else - ending= 1; -#endif - Hc->SetIntegerOption("Ending", ending); - } // endif ending - - // Calculate the default record size - switch (tc) { - case TAB_FIX: - recln= nlg + ending; // + length of line ending - break; - case TAB_BIN: - case TAB_VEC: - recln= nlg; - -// if ((k= (pak < 0) ? 8 : pak) > 1) - // See above for detailed comment - // Round up lrecl to multiple of 8 or pak -// recln= ((recln + k - 1) / k) * k; - - break; - case TAB_DOS: - case TAB_DBF: - recln= nlg; - break; - case TAB_CSV: - case TAB_FMT: - // The number of separators (assuming an extra one can exist) -// recln= poff * ((qotd) ? 3 : 1); to be investigated - recln= nlg + poff * 3; // To be safe - default: - break; - } // endswitch tc - - // lrecl must be at least recln to avoid buffer overflow - recln= max(recln, Hc->GetIntegerOption("Lrecl")); - Hc->SetIntegerOption("Lrecl", recln); - ddp->SetLrecl(recln); - } // endif Lrecl - - // Attach the column definition to the tabdef - defp->SetCols(tocols); - return poff; - } // end of GetColCatInfo - -/***********************************************************************/ -/* GetIndexInfo: retrieve index description from the table structure. */ -/***********************************************************************/ -bool MYCAT::GetIndexInfo(PGLOBAL g, PTABDEF defp) - { - // Attach new index(es) - defp->SetIndx(Hc->GetIndexInfo()); - return false; - } // end of GetIndexInfo - /***********************************************************************/ /* GetTableDesc: retrieve a table descriptor. */ /* Look for a table descriptor matching the name and type. */ diff --git a/storage/connect/mycat.h b/storage/connect/mycat.h index 4c1d548d6a5..b45d3a08725 100644 --- a/storage/connect/mycat.h +++ b/storage/connect/mycat.h @@ -40,6 +40,7 @@ bool IsExactType(TABTYPE type); bool IsTypeNullable(TABTYPE type); bool IsTypeFixed(TABTYPE type); bool IsTypeIndexable(TABTYPE type); +int GetIndexType(TABTYPE type); uint GetFuncID(const char *func); /***********************************************************************/ @@ -57,14 +58,6 @@ class MYCAT : public CATALOG { void Reset(void); void SetDataPath(PGLOBAL g, const char *path) {SetPath(g, &DataPath, path);} - bool GetBoolCatInfo(PSZ what, bool bdef); - bool SetIntCatInfo(PSZ what, int ival); - int GetIntCatInfo(PSZ what, int idef); - int GetSizeCatInfo(PSZ what, PSZ sdef); - int GetCharCatInfo(PSZ what, PSZ sdef, char *buf, int size); - char *GetStringCatInfo(PGLOBAL g, PSZ what, PSZ sdef); - int GetColCatInfo(PGLOBAL g, PTABDEF defp); - bool GetIndexInfo(PGLOBAL g, PTABDEF defp); bool StoreIndex(PGLOBAL g, PTABDEF defp) {return false;} // Temporary PRELDEF GetTableDesc(PGLOBAL g, LPCSTR name, LPCSTR type, PRELDEF *prp = NULL); diff --git a/storage/connect/plgdbutl.cpp b/storage/connect/plgdbutl.cpp index 2058ae0a362..939c6ab75eb 100644 --- a/storage/connect/plgdbutl.cpp +++ b/storage/connect/plgdbutl.cpp @@ -383,7 +383,7 @@ PCATLG PlgGetCatalog(PGLOBAL g, bool jump) } // end of PlgGetCatalog /***********************************************************************/ -/* PlgGetCatalog: returns CATALOG class pointer. */ +/* PlgGetDataPath: returns the default data path. */ /***********************************************************************/ char *PlgGetDataPath(PGLOBAL g) { diff --git a/storage/connect/reldef.cpp b/storage/connect/reldef.cpp index 24ea7dfc5cf..5129d8b7980 100644 --- a/storage/connect/reldef.cpp +++ b/storage/connect/reldef.cpp @@ -24,6 +24,7 @@ #include "osutil.h" //#include "sqlext.h" #endif +#include "handler.h" /***********************************************************************/ /* Include application header files */ @@ -46,6 +47,7 @@ #include "tabdos.h" #include "valblk.h" #include "tabmul.h" +#include "ha_connect.h" /* --------------------------- Class RELDEF -------------------------- */ @@ -60,8 +62,106 @@ RELDEF::RELDEF(void) Name = NULL; Database = NULL; Cat = NULL; + Hc = NULL; } // end of RELDEF constructor +/***********************************************************************/ +/* This function sets an integer table information. */ +/***********************************************************************/ +bool RELDEF::SetIntCatInfo(PSZ what, int n) + { + return Hc->SetIntegerOption(what, n); + } // end of SetIntCatInfo + +/***********************************************************************/ +/* This function returns integer table information. */ +/***********************************************************************/ +int RELDEF::GetIntCatInfo(PSZ what, int idef) + { + int n= Hc->GetIntegerOption(what); + + return (n == NO_IVAL) ? idef : n; + } // end of GetIntCatInfo + +/***********************************************************************/ +/* This function returns Boolean table information. */ +/***********************************************************************/ +bool RELDEF::GetBoolCatInfo(PSZ what, bool bdef) + { + bool b= Hc->GetBooleanOption(what, bdef); + + return b; + } // end of GetBoolCatInfo + +/***********************************************************************/ +/* This function returns size catalog information. */ +/***********************************************************************/ +int RELDEF::GetSizeCatInfo(PSZ what, PSZ sdef) + { + char * s, c; + int i, n= 0; + + if (!(s= Hc->GetStringOption(what))) + s= sdef; + + if ((i= sscanf(s, " %d %c ", &n, &c)) == 2) + switch (toupper(c)) { + case 'M': + n *= 1024; + case 'K': + n *= 1024; + } // endswitch c + + return n; +} // end of GetSizeCatInfo + +/***********************************************************************/ +/* This function sets char table information in buf. */ +/***********************************************************************/ +int RELDEF::GetCharCatInfo(PSZ what, PSZ sdef, char *buf, int size) + { + char *s= Hc->GetStringOption(what); + + strncpy(buf, ((s) ? s : sdef), size); + return size; + } // end of GetCharCatInfo + +/***********************************************************************/ +/* This function returns string table information. */ +/* Default parameter is "*" to get the handler default. */ +/***********************************************************************/ +char *RELDEF::GetStringCatInfo(PGLOBAL g, PSZ what, PSZ sdef) + { + char *sval= NULL, *s= Hc->GetStringOption(what, sdef); + + if (s) { + sval= (char*)PlugSubAlloc(g, NULL, strlen(s) + 1); + strcpy(sval, s); + } else if (!stricmp(what, "filename")) { + // Return default file name + char *ftype= Hc->GetStringOption("Type", "*"); + int i, n; + + if (IsFileType(GetTypeID(ftype))) { + sval= (char*)PlugSubAlloc(g, NULL, strlen(Hc->GetTableName()) + 12); + strcat(strcpy(sval, Hc->GetTableName()), "."); + n= strlen(sval); + + // Fold ftype to lower case + for (i= 0; i < 12; i++) + if (!ftype[i]) { + sval[n+i]= 0; + break; + } else + sval[n+i]= tolower(ftype[i]); + + } // endif FileType + + } // endif s + + return sval; + } // end of GetStringCatInfo + /* --------------------------- Class TABDEF -------------------------- */ /***********************************************************************/ @@ -91,24 +191,201 @@ bool TABDEF::Define(PGLOBAL g, PCATLG cat, LPCSTR name, LPCSTR am) Name = (PSZ)PlugSubAlloc(g, NULL, strlen(name) + 1); strcpy(Name, name); Cat = cat; - Catfunc = GetFuncID(Cat->GetStringCatInfo(g, "Catfunc", NULL)); - Elemt = cat->GetIntCatInfo("Elements", 0); - Multiple = cat->GetIntCatInfo("Multiple", 0); - Degree = cat->GetIntCatInfo("Degree", 0); - Read_Only = cat->GetBoolCatInfo("ReadOnly", false); - const char *data_charset_name= cat->GetStringCatInfo(g, "Data_charset", NULL); + Hc = ((MYCAT*)cat)->GetHandler(); + Catfunc = GetFuncID(GetStringCatInfo(g, "Catfunc", NULL)); + Elemt = GetIntCatInfo("Elements", 0); + Multiple = GetIntCatInfo("Multiple", 0); + Degree = GetIntCatInfo("Degree", 0); + Read_Only = GetBoolCatInfo("ReadOnly", false); + const char *data_charset_name= GetStringCatInfo(g, "Data_charset", NULL); m_data_charset= data_charset_name ? get_charset_by_csname(data_charset_name, MY_CS_PRIMARY, 0): NULL; // Get The column definitions - if ((poff = cat->GetColCatInfo(g, this)) < 0) + if ((poff = GetColCatInfo(g)) < 0) return true; // Do the definition of AM specific fields return DefineAM(g, am, poff); } // end of Define +/***********************************************************************/ +/* This function returns column table information. */ +/***********************************************************************/ +int TABDEF::GetColCatInfo(PGLOBAL g) + { + char *type= GetStringCatInfo(g, "Type", "*"); + int i, loff, poff, nof, nlg; + void *field= NULL; + TABTYPE tc; + PCOLDEF cdp, lcdp= NULL, tocols= NULL; + PCOLINFO pcf= (PCOLINFO)PlugSubAlloc(g, NULL, sizeof(COLINFO)); + + memset(pcf, 0, sizeof(COLINFO)); + + // Get a unique char identifier for type + tc= (Catfunc == FNC_NO) ? GetTypeID(type) : TAB_PRX; + + // Take care of the column definitions + i= poff= nof= nlg= 0; + + // Offsets of HTML and DIR tables start from 0, DBF at 1 + loff= (tc == TAB_DBF) ? 1 : (tc == TAB_XML || tc == TAB_DIR) ? -1 : 0; + + while (true) { + // Default Offset depends on table type + switch (tc) { + case TAB_DOS: + case TAB_FIX: + case TAB_BIN: + case TAB_VEC: + case TAB_DBF: + poff= loff + nof; // Default next offset + nlg= max(nlg, poff); // Default lrecl + break; + case TAB_CSV: + case TAB_FMT: + nlg+= nof; + case TAB_DIR: + case TAB_XML: + poff= loff + 1; + break; + case TAB_INI: + case TAB_MAC: + case TAB_TBL: + case TAB_XCL: + case TAB_OCCUR: + case TAB_PRX: + case TAB_OEM: + poff = 0; // Offset represents an independant flag + break; + default: // VCT PLG ODBC MYSQL WMI... + poff = 0; // NA + break; + } // endswitch tc + +// do { + field= Hc->GetColumnOption(g, field, pcf); +// } while (field && (*pcf->Name =='*' /*|| pcf->Flags & U_VIRTUAL*/)); + + if (tc == TAB_DBF && pcf->Type == TYPE_DATE && !pcf->Datefmt) { + // DBF date format defaults to 'YYYMMDD' + pcf->Datefmt= "YYYYMMDD"; + pcf->Length= 8; + } // endif tc + + if (!field) + break; + + // Allocate the column description block + cdp= new(g) COLDEF; + + if ((nof= cdp->Define(g, NULL, pcf, poff)) < 0) + return -1; // Error, probably unhandled type + else if (nof) + loff= cdp->GetOffset(); + + switch (tc) { + case TAB_VEC: + cdp->SetOffset(0); // Not to have shift + case TAB_BIN: + // BIN/VEC are packed by default + if (nof) + // Field width is the internal representation width + // that can also depend on the column format + switch (cdp->Fmt ? *cdp->Fmt : 'X') { + case 'C': break; + case 'R': + case 'F': + case 'L': + case 'I': nof= 4; break; + case 'D': nof= 8; break; + case 'S': nof= 2; break; + case 'T': nof= 1; break; + default: nof= cdp->Clen; + } // endswitch Fmt + + default: + break; + } // endswitch tc + + if (lcdp) + lcdp->SetNext(cdp); + else + tocols= cdp; + + lcdp= cdp; + i++; + } // endwhile + + // Degree is the the number of defined columns (informational) + if (i != GetDegree()) + SetDegree(i); + + if (GetDefType() == TYPE_AM_DOS) { + int ending, recln= 0; + + // Was commented because sometimes ending is 0 even when + // not specified (for instance if quoted is specified) +// if ((ending= Hc->GetIntegerOption("Ending")) < 0) { + if ((ending= Hc->GetIntegerOption("Ending")) <= 0) { +#if defined(WIN32) + ending= 2; +#else + ending= 1; +#endif + Hc->SetIntegerOption("Ending", ending); + } // endif ending + + // Calculate the default record size + switch (tc) { + case TAB_FIX: + recln= nlg + ending; // + length of line ending + break; + case TAB_BIN: + case TAB_VEC: + recln= nlg; + +// if ((k= (pak < 0) ? 8 : pak) > 1) + // See above for detailed comment + // Round up lrecl to multiple of 8 or pak +// recln= ((recln + k - 1) / k) * k; + + break; + case TAB_DOS: + case TAB_DBF: + recln= nlg; + break; + case TAB_CSV: + case TAB_FMT: + // The number of separators (assuming an extra one can exist) +// recln= poff * ((qotd) ? 3 : 1); to be investigated + recln= nlg + poff * 3; // To be safe + default: + break; + } // endswitch tc + + // lrecl must be at least recln to avoid buffer overflow + recln= max(recln, Hc->GetIntegerOption("Lrecl")); + Hc->SetIntegerOption("Lrecl", recln); + ((PDOSDEF)this)->SetLrecl(recln); + } // endif Lrecl + + // Attach the column definition to the tabdef + SetCols(tocols); + return poff; + } // end of GetColCatInfo + +/***********************************************************************/ +/* SetIndexInfo: retrieve index description from the table structure. */ +/***********************************************************************/ +void TABDEF::SetIndexInfo(void) + { + // Attach new index(es) + SetIndx(Hc->GetIndexInfo()); + } // end of SetIndexInfo + /* --------------------------- Class OEMDEF -------------------------- */ /***********************************************************************/ @@ -188,7 +465,7 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g) // Have the external class do its complete definition if (!cat->Cbuf) { // Suballocate a temporary buffer for the entire column section - cat->Cblen = cat->GetSizeCatInfo("Colsize", "8K"); + cat->Cblen = GetSizeCatInfo("Colsize", "8K"); cat->Cbuf = (char*)PlugSubAlloc(g, NULL, cat->Cblen); } // endif Cbuf @@ -218,8 +495,8 @@ bool OEMDEF::DeleteTableFile(PGLOBAL g) /***********************************************************************/ bool OEMDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { - Module = Cat->GetStringCatInfo(g, "Module", ""); - Subtype = Cat->GetStringCatInfo(g, "Subtype", Module); + Module = GetStringCatInfo(g, "Module", ""); + Subtype = GetStringCatInfo(g, "Subtype", Module); if (!*Module) Module = Subtype; diff --git a/storage/connect/reldef.h b/storage/connect/reldef.h index e0c37690a86..b46c30317fa 100644 --- a/storage/connect/reldef.h +++ b/storage/connect/reldef.h @@ -13,7 +13,8 @@ #include "catalog.h" #include "my_sys.h" -typedef class INDEXDEF *PIXDEF; +typedef class INDEXDEF *PIXDEF; +typedef class ha_connect *PHC; /***********************************************************************/ /* Table or View (relation) definition block. */ @@ -38,6 +39,12 @@ class DllExport RELDEF : public BLOCK { // Relation definition block void SetCat(PCATLG cat) { Cat=cat; } // Methods + bool GetBoolCatInfo(PSZ what, bool bdef); + bool SetIntCatInfo(PSZ what, int ival); + int GetIntCatInfo(PSZ what, int idef); + int GetSizeCatInfo(PSZ what, PSZ sdef); + int GetCharCatInfo(PSZ what, PSZ sdef, char *buf, int size); + char *GetStringCatInfo(PGLOBAL g, PSZ what, PSZ sdef); virtual bool Indexable(void) {return false;} virtual bool Define(PGLOBAL g, PCATLG cat, LPCSTR name, LPCSTR am) = 0; virtual PTDB GetTable(PGLOBAL g, MODE mode) = 0; @@ -48,6 +55,7 @@ class DllExport RELDEF : public BLOCK { // Relation definition block LPCSTR Database; /* Table database */ PCOLDEF To_Cols; /* To a list of column desc */ PCATLG Cat; /* To DB catalog info */ + PHC Hc; /* The Connect handler */ }; // end of RELDEF /***********************************************************************/ @@ -71,7 +79,7 @@ class DllExport TABDEF : public RELDEF { /* Logical table descriptor */ int GetPseudo(void) {return Pseudo;} PSZ GetPath(void) {return (Database) ? (PSZ)Database : Cat->GetDataPath();} - bool SepIndex(void) {return Cat->GetBoolCatInfo("SepIndex", false);} + bool SepIndex(void) {return GetBoolCatInfo("SepIndex", false);} bool IsReadOnly(void) {return Read_Only;} virtual AMT GetDefType(void) {return TYPE_AM_TAB;} virtual PIXDEF GetIndx(void) {return NULL;} @@ -80,6 +88,8 @@ class DllExport TABDEF : public RELDEF { /* Logical table descriptor */ const CHARSET_INFO *data_charset() {return m_data_charset;} // Methods + int GetColCatInfo(PGLOBAL g); + void SetIndexInfo(void); bool DropTable(PGLOBAL g, PSZ name); virtual bool Define(PGLOBAL g, PCATLG cat, LPCSTR name, LPCSTR am); virtual bool DefineAM(PGLOBAL, LPCSTR, int) = 0; @@ -168,9 +178,7 @@ class DllExport COLCRT : public BLOCK { /* Column description block /* Column definition block. */ /***********************************************************************/ class DllExport COLDEF : public COLCRT { /* Column description block */ - friend class CATALOG; - friend class PLUGCAT; - friend class MYCAT; + friend class TABDEF; friend class COLBLK; friend class DBFFAM; friend class TDBASE; diff --git a/storage/connect/tabdos.cpp b/storage/connect/tabdos.cpp index b56a392ba75..de97c3a6ea5 100644 --- a/storage/connect/tabdos.cpp +++ b/storage/connect/tabdos.cpp @@ -104,36 +104,37 @@ bool DOSDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) : (am && (*am == 'B' || *am == 'b')) ? "B" : (am && !stricmp(am, "DBF")) ? "D" : "V"; - Desc = Fn = Cat->GetStringCatInfo(g, "Filename", NULL); - Ofn = Cat->GetStringCatInfo(g, "Optname", Fn); - Cat->GetCharCatInfo("Recfm", (PSZ)dfm, buf, sizeof(buf)); + Desc = Fn = GetStringCatInfo(g, "Filename", NULL); + Ofn = GetStringCatInfo(g, "Optname", Fn); + GetCharCatInfo("Recfm", (PSZ)dfm, buf, sizeof(buf)); Recfm = (toupper(*buf) == 'F') ? RECFM_FIX : (toupper(*buf) == 'B') ? RECFM_BIN : (toupper(*buf) == 'D') ? RECFM_DBF : RECFM_VAR; - Lrecl = Cat->GetIntCatInfo("Lrecl", 0); + Lrecl = GetIntCatInfo("Lrecl", 0); if (Recfm != RECFM_DBF) - Compressed = Cat->GetIntCatInfo("Compressed", 0); + Compressed = GetIntCatInfo("Compressed", 0); - Mapped = Cat->GetBoolCatInfo("Mapped", map); - Block = Cat->GetIntCatInfo("Blocks", 0); - Last = Cat->GetIntCatInfo("Last", 0); - Ending = Cat->GetIntCatInfo("Ending", CRLF); + Mapped = GetBoolCatInfo("Mapped", map); + Block = GetIntCatInfo("Blocks", 0); + Last = GetIntCatInfo("Last", 0); + Ending = GetIntCatInfo("Ending", CRLF); if (Recfm == RECFM_FIX || Recfm == RECFM_BIN) { - Huge = Cat->GetBoolCatInfo("Huge", Cat->GetDefHuge()); - Padded = Cat->GetBoolCatInfo("Padded", false); - Blksize = Cat->GetIntCatInfo("Blksize", 0); - Eof = (Cat->GetIntCatInfo("EOF", 0) != 0); + Huge = GetBoolCatInfo("Huge", Cat->GetDefHuge()); + Padded = GetBoolCatInfo("Padded", false); + Blksize = GetIntCatInfo("Blksize", 0); + Eof = (GetIntCatInfo("EOF", 0) != 0); } else if (Recfm == RECFM_DBF) { - Maxerr = Cat->GetIntCatInfo("Maxerr", 0); - Accept = (Cat->GetIntCatInfo("Accept", 0) != 0); - ReadMode = Cat->GetIntCatInfo("Readmode", 0); + Maxerr = GetIntCatInfo("Maxerr", 0); + Accept = (GetIntCatInfo("Accept", 0) != 0); + ReadMode = GetIntCatInfo("Readmode", 0); } else // (Recfm == RECFM_VAR) - AvgLen = Cat->GetIntCatInfo("Avglen", 0); + AvgLen = GetIntCatInfo("Avglen", 0); // Ignore wrong Index definitions for catalog commands - return (Cat->GetIndexInfo(g, this) /*&& !Cat->GetCatFnc()*/); + SetIndexInfo(); + return false; } // end of DefineAM #if 0 @@ -190,7 +191,7 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf) return false; // No index // If true indexes are in separate files - sep = Cat->GetBoolCatInfo("SepIndex", false); + sep = GetBoolCatInfo("SepIndex", false); if (!sep && pxdf) { strcpy(g->Message, MSG(NO_RECOV_SPACE)); @@ -449,7 +450,6 @@ int TDBDOS::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) //PCOLDEF cdp; PXINDEX x; PXLOAD pxp; - PCATLG cat = PlgGetCatalog(g); Mode = MODE_READ; Use = USE_READY; @@ -498,7 +498,7 @@ int TDBDOS::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) } // endfor kdp keycols = (PCOL*)PlugSubAlloc(g, NULL, n * sizeof(PCOL)); - sep = cat->GetBoolCatInfo("SepIndex", false); + sep = dfp->GetBoolCatInfo("SepIndex", false); /*********************************************************************/ /* Construct and save the defined indexes. */ diff --git a/storage/connect/tabfmt.cpp b/storage/connect/tabfmt.cpp index 7155c93a363..4760af41d9d 100644 --- a/storage/connect/tabfmt.cpp +++ b/storage/connect/tabfmt.cpp @@ -415,10 +415,10 @@ bool CSVDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) if (DOSDEF::DefineAM(g, "CSV", poff)) return true; - Cat->GetCharCatInfo("Separator", ",", buf, sizeof(buf)); + GetCharCatInfo("Separator", ",", buf, sizeof(buf)); Sep = (strlen(buf) == 2 && buf[0] == '\\' && buf[1] == 't') ? '\t' : *buf; - Quoted = Cat->GetIntCatInfo("Quoted", -1); - Cat->GetCharCatInfo("Qchar", "", buf, sizeof(buf)); + Quoted = GetIntCatInfo("Quoted", -1); + GetCharCatInfo("Qchar", "", buf, sizeof(buf)); Qot = *buf; if (Qot && Quoted < 0) @@ -427,9 +427,9 @@ bool CSVDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Qot = '"'; Fmtd = (!Sep || (am && (*am == 'F' || *am == 'f'))); - Header = (Cat->GetIntCatInfo("Header", 0) != 0); - Maxerr = Cat->GetIntCatInfo("Maxerr", 0); - Accept = (Cat->GetIntCatInfo("Accept", 0) != 0); + Header = (GetIntCatInfo("Header", 0) != 0); + Maxerr = GetIntCatInfo("Maxerr", 0); + Accept = (GetIntCatInfo("Accept", 0) != 0); return false; } // end of DefineAM diff --git a/storage/connect/tabmul.cpp b/storage/connect/tabmul.cpp index 6f68cd5381a..6e4a63d0f6d 100755 --- a/storage/connect/tabmul.cpp +++ b/storage/connect/tabmul.cpp @@ -591,9 +591,9 @@ void TDBMUL::CloseDB(PGLOBAL g) /***********************************************************************/ bool DIRDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { - Desc = Fn = Cat->GetStringCatInfo(g, "Filename", NULL); - Incl = (Cat->GetIntCatInfo("Subdir", 0) != 0); - Huge = (Cat->GetIntCatInfo("Huge", 0) != 0); + Desc = Fn = GetStringCatInfo(g, "Filename", NULL); + Incl = (GetIntCatInfo("Subdir", 0) != 0); + Huge = (GetIntCatInfo("Huge", 0) != 0); return false; } // end of DefineAM diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp index 2bebad276c6..84a070f1ddf 100644 --- a/storage/connect/tabmysql.cpp +++ b/storage/connect/tabmysql.cpp @@ -268,22 +268,22 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) // For unspecified values, get the values of old style options // but only if called from MYSQLDEF, else set them to NULL Portnumber = (sport && sport[0]) ? atoi(sport) - : (b) ? Cat->GetIntCatInfo("Port", GetDefaultPort()) : 0; + : (b) ? GetIntCatInfo("Port", GetDefaultPort()) : 0; if (Username[0] == 0) - Username = (b) ? Cat->GetStringCatInfo(g, "User", "*") : NULL; + Username = (b) ? GetStringCatInfo(g, "User", "*") : NULL; if (Hostname[0] == 0) - Hostname = (b) ? Cat->GetStringCatInfo(g, "Host", "localhost") : NULL; + Hostname = (b) ? GetStringCatInfo(g, "Host", "localhost") : NULL; if (!Database || !*Database) - Database = (b) ? Cat->GetStringCatInfo(g, "Database", "*") : NULL; + Database = (b) ? GetStringCatInfo(g, "Database", "*") : NULL; if (!Tabname || !*Tabname) - Tabname = (b) ? Cat->GetStringCatInfo(g, "Tabname", Name) : NULL; + Tabname = (b) ? GetStringCatInfo(g, "Tabname", Name) : NULL; if (!Password) - Password = (b) ? Cat->GetStringCatInfo(g, "Password", NULL) : NULL; + Password = (b) ? GetStringCatInfo(g, "Password", NULL) : NULL; } // endif URL #if 0 @@ -308,37 +308,37 @@ bool MYSQLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) if (stricmp(am, "MYPRX")) { // Normal case of specific MYSQL table - url = Cat->GetStringCatInfo(g, "Connect", NULL); + url = GetStringCatInfo(g, "Connect", NULL); if (!url || !*url) { // Not using the connection URL - Hostname = Cat->GetStringCatInfo(g, "Host", "localhost"); - Database = Cat->GetStringCatInfo(g, "Database", "*"); - Tabname = Cat->GetStringCatInfo(g, "Name", Name); // Deprecated - Tabname = Cat->GetStringCatInfo(g, "Tabname", Tabname); - Username = Cat->GetStringCatInfo(g, "User", "*"); - Password = Cat->GetStringCatInfo(g, "Password", NULL); - Portnumber = Cat->GetIntCatInfo("Port", GetDefaultPort()); + Hostname = GetStringCatInfo(g, "Host", "localhost"); + Database = GetStringCatInfo(g, "Database", "*"); + Tabname = GetStringCatInfo(g, "Name", Name); // Deprecated + Tabname = GetStringCatInfo(g, "Tabname", Tabname); + Username = GetStringCatInfo(g, "User", "*"); + Password = GetStringCatInfo(g, "Password", NULL); + Portnumber = GetIntCatInfo("Port", GetDefaultPort()); Server = Hostname; } else if (ParseURL(g, url)) return true; - Bind = !!Cat->GetIntCatInfo("Bind", 0); - Delayed = !!Cat->GetIntCatInfo("Delayed", 0); + Bind = !!GetIntCatInfo("Bind", 0); + Delayed = !!GetIntCatInfo("Delayed", 0); } else { // MYSQL access from a PROXY table - Database = Cat->GetStringCatInfo(g, "Database", "*"); - Isview = Cat->GetBoolCatInfo("View", FALSE); + Database = GetStringCatInfo(g, "Database", "*"); + Isview = GetBoolCatInfo("View", FALSE); // We must get other connection parms from the calling table Remove_tshp(Cat); - url = Cat->GetStringCatInfo(g, "Connect", NULL); + url = GetStringCatInfo(g, "Connect", NULL); if (!url || !*url) { - Hostname = Cat->GetStringCatInfo(g, "Host", "localhost"); - Username = Cat->GetStringCatInfo(g, "User", "*"); - Password = Cat->GetStringCatInfo(g, "Password", NULL); - Portnumber = Cat->GetIntCatInfo("Port", GetDefaultPort()); + Hostname = GetStringCatInfo(g, "Host", "localhost"); + Username = GetStringCatInfo(g, "User", "*"); + Password = GetStringCatInfo(g, "Password", NULL); + Portnumber = GetIntCatInfo("Port", GetDefaultPort()); Server = Hostname; } else { char *locdb = Database; @@ -352,16 +352,16 @@ bool MYSQLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Tabname = Name; } // endif am - if ((Srcdef = Cat->GetStringCatInfo(g, "Srcdef", NULL))) + if ((Srcdef = GetStringCatInfo(g, "Srcdef", NULL))) Isview = true; // Used for Update and Delete - Qrystr = Cat->GetStringCatInfo(g, "Query_String", "?"); - Quoted = Cat->GetIntCatInfo("Quoted", 0); + Qrystr = GetStringCatInfo(g, "Query_String", "?"); + Quoted = GetIntCatInfo("Quoted", 0); // Specific for command executing tables - Xsrc = Cat->GetBoolCatInfo("Execsrc", false); - Mxr = Cat->GetIntCatInfo("Maxerr", 0); + Xsrc = GetBoolCatInfo("Execsrc", false); + Mxr = GetIntCatInfo("Maxerr", 0); return FALSE; } // end of DefineAM diff --git a/storage/connect/taboccur.cpp b/storage/connect/taboccur.cpp index 5edbe932d50..96901424a7d 100644 --- a/storage/connect/taboccur.cpp +++ b/storage/connect/taboccur.cpp @@ -264,9 +264,9 @@ bool OcrSrcCols(PGLOBAL g, PQRYRES qrp, const char *col, /***********************************************************************/ bool OCCURDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { - Rcol = Cat->GetStringCatInfo(g, "RankCol", ""); - Colist = Cat->GetStringCatInfo(g, "Colist", ""); - Xcol = Cat->GetStringCatInfo(g, "OccurCol", Colist); + Rcol = GetStringCatInfo(g, "RankCol", ""); + Colist = GetStringCatInfo(g, "Colist", ""); + Xcol = GetStringCatInfo(g, "OccurCol", Colist); return PRXDEF::DefineAM(g, am, poff); } // end of DefineAM diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index cbce9adc7ac..10ac1fda211 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -100,22 +100,22 @@ ODBCDEF::ODBCDEF(void) /***********************************************************************/ bool ODBCDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { - Desc = Connect = Cat->GetStringCatInfo(g, "Connect", ""); - Tabname = Cat->GetStringCatInfo(g, "Name", + Desc = Connect = GetStringCatInfo(g, "Connect", ""); + Tabname = GetStringCatInfo(g, "Name", (Catfunc & (FNC_TABLE | FNC_COL)) ? NULL : Name); - Tabname = Cat->GetStringCatInfo(g, "Tabname", Tabname); - Tabschema = Cat->GetStringCatInfo(g, "Dbname", NULL); - Tabschema = Cat->GetStringCatInfo(g, "Schema", Tabschema); - Tabcat = Cat->GetStringCatInfo(g, "Qualifier", NULL); - Tabcat = Cat->GetStringCatInfo(g, "Catalog", Tabcat); - Srcdef = Cat->GetStringCatInfo(g, "Srcdef", NULL); - Qrystr = Cat->GetStringCatInfo(g, "Query_String", "?"); - Sep = Cat->GetStringCatInfo(g, "Separator", NULL); - Catver = Cat->GetIntCatInfo("Catver", 2); - Xsrc = Cat->GetBoolCatInfo("Execsrc", FALSE); - Maxerr = Cat->GetIntCatInfo("Maxerr", 0); - Maxres = Cat->GetIntCatInfo("Maxres", 0); - Quoted = Cat->GetIntCatInfo("Quoted", 0); + Tabname = GetStringCatInfo(g, "Tabname", Tabname); + Tabschema = GetStringCatInfo(g, "Dbname", NULL); + Tabschema = GetStringCatInfo(g, "Schema", Tabschema); + Tabcat = GetStringCatInfo(g, "Qualifier", NULL); + Tabcat = GetStringCatInfo(g, "Catalog", Tabcat); + Srcdef = GetStringCatInfo(g, "Srcdef", NULL); + Qrystr = GetStringCatInfo(g, "Query_String", "?"); + Sep = GetStringCatInfo(g, "Separator", NULL); + Catver = GetIntCatInfo("Catver", 2); + Xsrc = GetBoolCatInfo("Execsrc", FALSE); + Maxerr = GetIntCatInfo("Maxerr", 0); + Maxres = GetIntCatInfo("Maxres", 0); + Quoted = GetIntCatInfo("Quoted", 0); Options = ODBConn::noOdbcDialog; Pseudo = 2; // FILID is Ok but not ROWID return false; diff --git a/storage/connect/tabpivot.cpp b/storage/connect/tabpivot.cpp index ddfcd54a899..7e54b62caaa 100644 --- a/storage/connect/tabpivot.cpp +++ b/storage/connect/tabpivot.cpp @@ -344,11 +344,11 @@ bool PIVOTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) DB = (char*)Tablep->GetQualifier(); Tabsrc = (char*)Tablep->GetSrc(); - Host = Cat->GetStringCatInfo(g, "Host", "localhost"); - User = Cat->GetStringCatInfo(g, "User", "*"); - Pwd = Cat->GetStringCatInfo(g, "Password", NULL); - Picol = Cat->GetStringCatInfo(g, "PivotCol", NULL); - Fncol = Cat->GetStringCatInfo(g, "FncCol", NULL); + Host = GetStringCatInfo(g, "Host", "localhost"); + User = GetStringCatInfo(g, "User", "*"); + Pwd = GetStringCatInfo(g, "Password", NULL); + Picol = GetStringCatInfo(g, "PivotCol", NULL); + Fncol = GetStringCatInfo(g, "FncCol", NULL); // If fncol is like avg(colname), separate Fncol and Function if (Fncol && (p1 = strchr(Fncol, '(')) && (p2 = strchr(p1, ')')) && @@ -357,11 +357,11 @@ bool PIVOTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Function = Fncol; Fncol = p1; } else - Function = Cat->GetStringCatInfo(g, "Function", "SUM"); + Function = GetStringCatInfo(g, "Function", "SUM"); - GBdone = Cat->GetBoolCatInfo("Groupby", false); - Accept = Cat->GetBoolCatInfo("Accept", false); - Port = Cat->GetIntCatInfo("Port", 3306); + GBdone = GetBoolCatInfo("Groupby", false); + Accept = GetBoolCatInfo("Accept", false); + Port = GetIntCatInfo("Port", 3306); Desc = (Tabsrc) ? Tabsrc : Tabname; return FALSE; } // end of DefineAM diff --git a/storage/connect/tabsys.cpp b/storage/connect/tabsys.cpp index 409352fdee6..e8ea7f4e43a 100644 --- a/storage/connect/tabsys.cpp +++ b/storage/connect/tabsys.cpp @@ -76,8 +76,8 @@ bool INIDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { char buf[8]; - Fn = Cat->GetStringCatInfo(g, "Filename", NULL); - Cat->GetCharCatInfo("Layout", "C", buf, sizeof(buf)); + Fn = GetStringCatInfo(g, "Filename", NULL); + GetCharCatInfo("Layout", "C", buf, sizeof(buf)); Layout = toupper(*buf); if (Fn) { @@ -90,7 +90,7 @@ bool INIDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) return true; } // endif Fn - Ln = Cat->GetSizeCatInfo("Secsize", "8K"); + Ln = GetSizeCatInfo("Secsize", "8K"); Desc = Fn; return false; } // end of DefineAM diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp index c78c62af9cc..0aeeb0b9d8d 100644 --- a/storage/connect/tabtbl.cpp +++ b/storage/connect/tabtbl.cpp @@ -111,9 +111,9 @@ bool TBLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) char *tablist, *dbname, *def = NULL; Desc = "Table list table"; - tablist = Cat->GetStringCatInfo(g, "Tablist", ""); - dbname = Cat->GetStringCatInfo(g, "Dbname", "*"); - def = Cat->GetStringCatInfo(g, "Srcdef", NULL); + tablist = GetStringCatInfo(g, "Tablist", ""); + dbname = GetStringCatInfo(g, "Dbname", "*"); + def = GetStringCatInfo(g, "Srcdef", NULL); Ntables = 0; if (*tablist) { @@ -155,9 +155,9 @@ bool TBLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) } // endfor pdb - Maxerr = Cat->GetIntCatInfo("Maxerr", 0); - Accept = Cat->GetBoolCatInfo("Accept", false); - Thread = Cat->GetBoolCatInfo("Thread", false); + Maxerr = GetIntCatInfo("Maxerr", 0); + Accept = GetBoolCatInfo("Accept", false); + Thread = GetBoolCatInfo("Thread", false); } // endif tablist return FALSE; diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp index e77af35a8a4..4b9046e08d1 100644 --- a/storage/connect/tabutil.cpp +++ b/storage/connect/tabutil.cpp @@ -307,10 +307,10 @@ bool PRXDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { char *pn, *db, *tab, *def = NULL; - db = Cat->GetStringCatInfo(g, "Dbname", "*"); - def = Cat->GetStringCatInfo(g, "Srcdef", NULL); + db = GetStringCatInfo(g, "Dbname", "*"); + def = GetStringCatInfo(g, "Srcdef", NULL); - if (!(tab = Cat->GetStringCatInfo(g, "Tabname", NULL))) { + if (!(tab = GetStringCatInfo(g, "Tabname", NULL))) { if (!def) { strcpy(g->Message, "Missing object table definition"); return TRUE; diff --git a/storage/connect/tabvct.cpp b/storage/connect/tabvct.cpp index 2d4a649fc65..73dfef6a4d6 100644 --- a/storage/connect/tabvct.cpp +++ b/storage/connect/tabvct.cpp @@ -95,13 +95,13 @@ bool VCTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { DOSDEF::DefineAM(g, "BIN", poff); - Estimate = Cat->GetIntCatInfo("Estimate", 0); - Split = Cat->GetIntCatInfo("Split", (Estimate) ? 0 : 1); - Header = Cat->GetIntCatInfo("Header", 0); + Estimate = GetIntCatInfo("Estimate", 0); + Split = GetIntCatInfo("Split", (Estimate) ? 0 : 1); + Header = GetIntCatInfo("Header", 0); // CONNECT must have Block/Last info for VEC tables if (Estimate && !Split && !Header) { - char *fn = Cat->GetStringCatInfo(g, "Filename", "?"); + char *fn = GetStringCatInfo(g, "Filename", "?"); // No separate header file fo urbi tables Header = (*fn == '?') ? 3 : 2; @@ -112,7 +112,7 @@ bool VCTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) // For packed files the logical record length is calculated in poff if (poff != Lrecl) { Lrecl = poff; - Cat->SetIntCatInfo("Lrecl", poff); + SetIntCatInfo("Lrecl", poff); } // endif poff Padded = false; diff --git a/storage/connect/tabwmi.cpp b/storage/connect/tabwmi.cpp index 5052268b9e2..e47df028dc2 100644 --- a/storage/connect/tabwmi.cpp +++ b/storage/connect/tabwmi.cpp @@ -335,8 +335,8 @@ PQRYRES WMIColumns(PGLOBAL g, char *nsp, char *cls, bool info) /***********************************************************************/ bool WMIDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { - Nspace = Cat->GetStringCatInfo(g, "Namespace", "Root\\CimV2"); - Wclass = Cat->GetStringCatInfo(g, "Class", + Nspace = GetStringCatInfo(g, "Namespace", "Root\\CimV2"); + Wclass = GetStringCatInfo(g, "Class", (!stricmp(Nspace, "root\\cimv2") ? "ComputerSystemProduct" : !stricmp(Nspace, "root\\cli") ? "Msft_CliAlias" : "")); @@ -349,7 +349,7 @@ bool WMIDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) } // endif Wclass if (Catfunc == FNC_NO) - Ems = Cat->GetIntCatInfo("Estimate", 100); + Ems = GetIntCatInfo("Estimate", 100); return false; } // end of DefineAM diff --git a/storage/connect/tabxcl.cpp b/storage/connect/tabxcl.cpp index 41a4283fd22..bd3d57257ff 100644 --- a/storage/connect/tabxcl.cpp +++ b/storage/connect/tabxcl.cpp @@ -78,10 +78,10 @@ bool XCLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { char buf[8]; - Xcol = Cat->GetStringCatInfo(g, "Colname", ""); - Cat->GetCharCatInfo("Separator", ",", buf, sizeof(buf)); + Xcol = GetStringCatInfo(g, "Colname", ""); + GetCharCatInfo("Separator", ",", buf, sizeof(buf)); Sep = (strlen(buf) == 2 && buf[0] == '\\' && buf[1] == 't') ? '\t' : *buf; - Mult = Cat->GetIntCatInfo("Mult", 10); + Mult = GetIntCatInfo("Mult", 10); return PRXDEF::DefineAM(g, am, poff); } // end of DefineAM diff --git a/storage/connect/tabxml.cpp b/storage/connect/tabxml.cpp index 77dc7617e8a..c7c61f0dcbb 100644 --- a/storage/connect/tabxml.cpp +++ b/storage/connect/tabxml.cpp @@ -95,21 +95,21 @@ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) //void *memp = Cat->GetDescp(); //PSZ dbfile = Cat->GetDescFile(); - Fn = Cat->GetStringCatInfo(g, "Filename", NULL); - Encoding = Cat->GetStringCatInfo(g, "Encoding", "UTF-8"); + Fn = GetStringCatInfo(g, "Filename", NULL); + Encoding = GetStringCatInfo(g, "Encoding", "UTF-8"); if (*Fn == '?') { strcpy(g->Message, MSG(MISSING_FNAME)); return true; } // endif fn - if ((signed)Cat->GetIntCatInfo("Flag", -1) != -1) { + if ((signed)GetIntCatInfo("Flag", -1) != -1) { strcpy(g->Message, MSG(DEPREC_FLAG)); return true; } // endif flag defrow = defcol = ""; - Cat->GetCharCatInfo("Coltype", "", buf, sizeof(buf)); + GetCharCatInfo("Coltype", "", buf, sizeof(buf)); switch (toupper(*buf)) { case 'A': // Attribute @@ -136,25 +136,25 @@ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) return true; } // endswitch typname - Tabname = Cat->GetStringCatInfo(g, "Name", Name); // Deprecated - Tabname = Cat->GetStringCatInfo(g, "Table_name", Tabname); // Deprecated - Tabname = Cat->GetStringCatInfo(g, "Tabname", Tabname); - Rowname = Cat->GetStringCatInfo(g, "Rownode", defrow); - Colname = Cat->GetStringCatInfo(g, "Colnode", defcol); - Mulnode = Cat->GetStringCatInfo(g, "Mulnode", ""); - XmlDB = Cat->GetStringCatInfo(g, "XmlDB", ""); - Nslist = Cat->GetStringCatInfo(g, "Nslist", ""); - DefNs = Cat->GetStringCatInfo(g, "DefNs", ""); - Limit = Cat->GetIntCatInfo("Limit", 2); - Xpand = (Cat->GetIntCatInfo("Expand", 0) != 0); - Header = Cat->GetIntCatInfo("Header", 0); - Cat->GetCharCatInfo("Xmlsup", "*", buf, sizeof(buf)); + Tabname = GetStringCatInfo(g, "Name", Name); // Deprecated + Tabname = GetStringCatInfo(g, "Table_name", Tabname); // Deprecated + Tabname = GetStringCatInfo(g, "Tabname", Tabname); + Rowname = GetStringCatInfo(g, "Rownode", defrow); + Colname = GetStringCatInfo(g, "Colnode", defcol); + Mulnode = GetStringCatInfo(g, "Mulnode", ""); + XmlDB = GetStringCatInfo(g, "XmlDB", ""); + Nslist = GetStringCatInfo(g, "Nslist", ""); + DefNs = GetStringCatInfo(g, "DefNs", ""); + Limit = GetIntCatInfo("Limit", 2); + Xpand = (GetIntCatInfo("Expand", 0) != 0); + Header = GetIntCatInfo("Header", 0); + GetCharCatInfo("Xmlsup", "*", buf, sizeof(buf)); //if (*buf == '*') // Try the old (deprecated) option -// Cat->GetCharCatInfo("Method", "*", buf, sizeof(buf)); +// GetCharCatInfo("Method", "*", buf, sizeof(buf)); //if (*buf == '*') // Is there a default for the database? -// Cat->GetCharCatInfo("Defxml", XMLSUP, buf, sizeof(buf)); +// GetCharCatInfo("Defxml", XMLSUP, buf, sizeof(buf)); // Note that if no support is specified, the default is MS-DOM // on Windows and libxml2 otherwise @@ -168,8 +168,8 @@ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Usedom = (toupper(*buf) == 'M' || toupper(*buf) == 'D'); // Get eventual table node attribute - Attrib = Cat->GetStringCatInfo(g, "Attribute", ""); - Hdattr = Cat->GetStringCatInfo(g, "HeadAttr", ""); + Attrib = GetStringCatInfo(g, "Attribute", ""); + Hdattr = GetStringCatInfo(g, "HeadAttr", ""); return false; } // end of DefineAM diff --git a/storage/connect/xindex.cpp b/storage/connect/xindex.cpp index 1e29f687f38..e2a2020c8c3 100755 --- a/storage/connect/xindex.cpp +++ b/storage/connect/xindex.cpp @@ -723,7 +723,7 @@ bool XINDEX::SaveIndex(PGLOBAL g, PIXDEF sxp) return true; } // endswitch Ftype - if ((sep = dup->Catalog->GetBoolCatInfo("SepIndex", false))) { + if ((sep = defp->GetBoolCatInfo("SepIndex", false))) { // Index is saved in a separate file #if !defined(UNIX) char drive[_MAX_DRIVE];