bool TDBTBL::InitTableList(PGLOBAL g) { int n; uint sln; char *scs; PTABLE tp, tabp; PCOL colp; PTBLDEF tdp = (PTBLDEF)To_Def; PCATLG cat = To_Def->GetCat(); PHC hc = ((MYCAT*)cat)->GetHandler(); scs = hc->get_table()->s->connect_string.str; sln = hc->get_table()->s->connect_string.length; // PlugSetPath(filename, Tdbp->GetFile(g), Tdbp->GetPath()); for (n = 0, tp = tdp->Tablep; tp; tp = tp->GetNext()) { if (TestFil(g, To_CondFil, tp)) { tabp = new(g) XTAB(tp); if (tabp->GetSrc()) { // Table list is a list of connections hc->get_table()->s->connect_string.str = (char*)tabp->GetName(); hc->get_table()->s->connect_string.length = strlen(tabp->GetName()); } // endif Src // Get the table description block of this table if (!(Tdbp = GetSubTable(g, tabp))) { if (++Nbc > Maxerr) return TRUE; // Error return else continue; // Skip this table } else RemoveNext(tabp); // To avoid looping // We must allocate subtable columns before GetMaxSize is called // because some (PLG, ODBC?) need to have their columns attached. // Real initialization will be done later. for (colp = Columns; colp; colp = colp->GetNext()) if (!colp->IsSpecial()) if (((PPRXCOL)colp)->Init(g, NULL) && !Accept) return TRUE; if (Tablist) Tablist->Link(tabp); else Tablist = tabp; n++; } // endif filp } // endfor tp hc->get_table()->s->connect_string.str = scs; hc->get_table()->s->connect_string.length = sln; //NumTables = n; To_CondFil = NULL; // To avoid doing it several times return FALSE; } // end of InitTableList
bool TDBOCCUR::MakeColumnList(PGLOBAL g) { char *pn; int i; PCOL colp; for (colp = Columns; colp; colp = colp->GetNext()) if (colp->GetAmType() == TYPE_AM_PRX) if (((PPRXCOL)colp)->Init(g, NULL)) return true; Col = (PCOL*)PlugSubAlloc(g, NULL, Mult * sizeof(PCOL)); for (i = 0, pn = Colist; i < Mult; i++, pn += (strlen(pn) + 1)) { if (!(Col[i] = Tdbp->ColDB(g, pn, 0))) { // Column not found in table sprintf(g->Message, MSG(COL_ISNOT_TABLE), pn, Tabname); return true; } // endif Col if (Col[i]->InitValue(g)) { strcpy(g->Message, "OCCUR InitValue failed"); return true; } // endif InitValue } // endfor i return false; } // end of MakeColumnList
PCOL TDBASE::InsertSpecialColumn(PCOL colp) { if (!colp->IsSpecial()) return NULL; colp->SetNext(Columns); Columns = colp; return colp; } // end of InsertSpecialColumn
int TDBTBL::ReadDB(PGLOBAL g) { int rc; if (!CurTable) return RC_EF; else if (To_Kindex) { /*******************************************************************/ /* Reading is by an index table. */ /*******************************************************************/ strcpy(g->Message, MSG(NO_INDEX_READ)); rc = RC_FX; } else { /*******************************************************************/ /* Now start the reading process. */ /*******************************************************************/ retry: rc = Tdbp->ReadDB(g); if (rc == RC_EF) { // Total number of rows met so far Rows += Tdbp->RowNumber(g) - 1; Crp += Tdbp->GetProgMax(g); if ((CurTable = CurTable->GetNext())) { /***************************************************************/ /* Continue reading from next table file. */ /***************************************************************/ Tdbp->CloseDB(g); Tdbp = (PTDBASE)CurTable->GetTo_Tdb(); // Check and initialize the subtable columns for (PCOL cp = Columns; cp; cp = cp->GetNext()) if (cp->GetAmType() == TYPE_AM_TABID || cp->GetAmType() == TYPE_AM_SRVID) cp->COLBLK::Reset(); else if (((PPRXCOL)cp)->Init(g, NULL) && !Accept) return RC_FX; if (trace) htrc("Opening subtable %s\n", Tdbp->GetName()); // Now we can safely open the table if (Tdbp->OpenDB(g)) // Open next table return RC_FX; goto retry; } // endif iFile } else if (rc == RC_FX) strcat(strcat(strcat(g->Message, " ("), Tdbp->GetName()), ")"); } // endif To_Kindex return rc; } // end of ReadDB
bool TDBTBL::OpenDB(PGLOBAL g) { if (trace) htrc("TBL OpenDB: tdbp=%p tdb=R%d use=%d key=%p mode=%d\n", this, Tdb_No, Use, To_Key_Col, Mode); if (Use == USE_OPEN) { /*******************************************************************/ /* Table already open, replace it at its beginning. */ /*******************************************************************/ ResetDB(); return Tdbp->OpenDB(g); // Re-open fist table } // endif use /*********************************************************************/ /* When GetMaxsize was called, To_CondFil was not set yet. */ /*********************************************************************/ if (To_CondFil && Tablist) { Tablist = NULL; Nbc = 0; } // endif To_CondFil /*********************************************************************/ /* Open the first table of the list. */ /*********************************************************************/ if (!Tablist && InitTableList(g)) // done in GetMaxSize return TRUE; if ((CurTable = Tablist)) { Tdbp = (PTDBASE)CurTable->GetTo_Tdb(); // Tdbp->SetMode(Mode); // Tdbp->ResetDB(); // Tdbp->ResetSize(); // Check and initialize the subtable columns for (PCOL cp = Columns; cp; cp = cp->GetNext()) if (cp->GetAmType() == TYPE_AM_TABID) cp->COLBLK::Reset(); else if (((PPRXCOL)cp)->Init(g, NULL) && !Accept) return TRUE; if (trace) htrc("Opening subtable %s\n", Tdbp->GetName()); // Now we can safely open the table if (Tdbp->OpenDB(g)) return TRUE; } // endif *Tablist Use = USE_OPEN; return FALSE; } // end of OpenDB
bool TDBPRX::OpenDB(PGLOBAL g) { if (Use == USE_OPEN) { /*******************************************************************/ /* Table already open, just replace it at its beginning. */ /*******************************************************************/ return Tdbp->OpenDB(g); } // endif use if (InitTable(g)) return true; else if (Mode != MODE_READ && (Read_Only || Tdbp->IsReadOnly())) { strcpy(g->Message, "Cannot modify a read only table"); return true; } // endif tp /*********************************************************************/ /* Check and initialize the subtable columns. */ /*********************************************************************/ for (PCOL cp = Columns; cp; cp = cp->GetNext()) if (((PPRXCOL)cp)->Init(g, Tdbp)) return true; /*********************************************************************/ /* In Update mode, the updated column blocks must be distinct from */ /* the read column blocks. So make a copy of the TDB and allocate */ /* its column blocks in mode write (required by XML tables). */ /*********************************************************************/ if (Mode == MODE_UPDATE) { PTDBASE utp; if (!(utp= (PTDBASE)Tdbp->Duplicate(g))) { sprintf(g->Message, MSG(INV_UPDT_TABLE), Tdbp->GetName()); return true; } // endif tp for (PCOL cp = To_SetCols; cp; cp = cp->GetNext()) if (((PPRXCOL)cp)->Init(g, utp)) return true; } else if (Mode == MODE_DELETE) Tdbp->SetNext(Next); /*********************************************************************/ /* Physically open the object table. */ /*********************************************************************/ if (Tdbp->OpenDB(g)) return true; Tdbp->SetNext(NULL); Use = USE_OPEN; return false; } // end of OpenDB
void TDBTBM::ResetDB(void) { for (PCOL colp = Columns; colp; colp = colp->GetNext()) if (colp->GetAmType() == TYPE_AM_TABID) colp->COLBLK::Reset(); for (PTABLE tabp = Tablist; tabp; tabp = tabp->GetNext()) ((PTDBASE)tabp->GetTo_Tdb())->ResetDB(); Tdbp = (Tablist) ? (PTDBASE)Tablist->GetTo_Tdb() : NULL; Crp = 0; } // end of ResetDB
FNCCOL::FNCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) : COLBLK(cdp, tdbp, i) { if (cprec) { Next = cprec->GetNext(); cprec->SetNext(this); } else { Next = tdbp->GetColumns(); tdbp->SetColumns(this); } // endif cprec Value = NULL; // We'll get a new one later Hval = NULL; // The unconverted header value Xcolp = NULL; } // end of FNCCOL constructor
PCOL TDBWMI::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) { PCOL colp; colp = new(g) WMICOL(cdp, this, n); if (cprec) { colp->SetNext(cprec->GetNext()); cprec->SetNext(colp); } else { colp->SetNext(Columns); Columns = colp; } // endif cprec return colp; } // end of MakeCol
PCOL TDBTBL::InsertSpecialColumn(PCOL scp) { PCOL colp; if (!scp->IsSpecial()) return NULL; if (scp->GetAmType() == TYPE_AM_TABID) // This special column is handled locally colp = new((TIDBLK*)scp) TBTBLK(scp->GetValue()); else // Other special columns are treated normally colp = scp; colp->SetNext(Columns); Columns = colp; return colp; } // end of InsertSpecialColumn
INICOL::INICOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) : COLBLK(cdp, tdbp, i) { if (cprec) { Next = cprec->GetNext(); cprec->SetNext(this); } else { Next = tdbp->GetColumns(); tdbp->SetColumns(this); } // endif cprec // Set additional INI access method information for column. Valbuf = NULL; Flag = cdp->GetOffset(); Long = cdp->GetLong(); To_Val = NULL; } // end of INICOL constructor
int TDBTBM::ReadNextRemote(PGLOBAL g) { bool b = false; if (Tdbp) Tdbp->CloseDB(g); Cmp = NULL; retry: // Search for a remote table having its result set for (PTBMT tp = Tmp; tp; tp = tp->Next) if (tp->Ready) { if (!tp->Complete) Cmp = tp; } else b = true; if (!Cmp) { if (b) { // more result to come // sleep(20); goto retry; } else return RC_EF; } // endif Curtable Tdbp = (PTDBASE)Cmp->Tap->GetTo_Tdb(); // Check and initialize the subtable columns for (PCOL cp = Columns; cp; cp = cp->GetNext()) if (cp->GetAmType() == TYPE_AM_TABID) cp->COLBLK::Reset(); else if (((PPRXCOL)cp)->Init(g, NULL) && !Accept) return RC_FX; if (trace) htrc("Reading subtable %s\n", Tdbp->GetName()); return RC_OK; } // end of ReadNextRemote
void TDB::Print(PGLOBAL g, FILE *f, uint n) { PCOL cp; char m[64]; memset(m, ' ', n); // Make margin string m[n] = '\0'; for (PTDB tp = this; tp; tp = tp->Next) { fprintf(f, "%sTDB (%p) %s no=%d use=%d type=%d\n", m, tp, tp->Name, tp->Tdb_No, tp->Use, tp->GetAmType()); tp->PrintAM(f, m); fprintf(f, "%s Columns (deg=%d):\n", m, tp->Degree); for (cp = tp->Columns; cp; cp = cp->GetNext()) cp->Print(g, f, n); } /* endfor tp */ } // end of Print
bool TDBXCL::OpenDB(PGLOBAL g) { if (Use == USE_OPEN) { /*******************************************************************/ /* Table already open, just replace it at its beginning. */ /*******************************************************************/ M = N = 0; RowFlag = 0; New = TRUE; return Tdbp->OpenDB(g); } // endif use if (Mode != MODE_READ) { /*******************************************************************/ /* Currently XCOL tables cannot be modified. */ /*******************************************************************/ strcpy(g->Message, "XCOL tables are read only"); return TRUE; } // endif Mode if (InitTable(g)) return TRUE; /*********************************************************************/ /* Check and initialize the subtable columns. */ /*********************************************************************/ for (PCOL cp = Columns; cp; cp = cp->GetNext()) if (!cp->IsSpecial()) if (((PPRXCOL)cp)->Init(g, NULL)) return TRUE; /*********************************************************************/ /* Physically open the object table. */ /*********************************************************************/ if (Tdbp->OpenDB(g)) return TRUE; Use = USE_OPEN; return FALSE; } // end of OpenDB
PCOL TDBOCCUR::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) { PCOL colp = NULL; if (!stricmp(cdp->GetName(), Rcolumn)) { // Allocate a RANK column colp = new(g) RANKCOL(cdp, this, n); } else if (!stricmp(cdp->GetName(), Xcolumn)) { // Allocate the OCCUR column colp = Xcolp = new(g) OCCURCOL(cdp, this, n); } else return new(g) PRXCOL(cdp, this, cprec, n); if (cprec) { colp->SetNext(cprec->GetNext()); cprec->SetNext(colp); } else { colp->SetNext(Columns); Columns = colp; } // endif cprec return colp; } // end of MakeCol
PRXCOL::PRXCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) : COLBLK(cdp, tdbp, i) { if (cprec) { Next = cprec->GetNext(); cprec->SetNext(this); } else { Next = tdbp->GetColumns(); tdbp->SetColumns(this); } // endif cprec // Set additional Dos access method information for column. Long = cdp->GetLong(); // Useful ??? //strcpy(F_Date, cdp->F_Date); Colp = NULL; To_Val = NULL; Pseudo = false; Colnum = cdp->GetOffset(); // If columns are retrieved by number if (trace) htrc(" making new %sCOL C%d %s at %p\n", am, Index, Name, this); } // end of PRXCOL constructor
bool TDBPIVOT::MakePivotColumns(PGLOBAL g) { if (!Tdbp->IsView()) { // This was not done yet if GBdone is true if (FindDefaultColumns(g)) return true; // Now it is time to allocate the pivot and function columns if (!(Fcolp = Tdbp->ColDB(g, Fncol, 0))) { // Function column not found in table sprintf(g->Message, MSG(COL_ISNOT_TABLE), Fncol, Tabname); return true; } else if (Fcolp->InitValue(g)) return true; if (!(Xcolp = Tdbp->ColDB(g, Picol, 0))) { // Pivot column not found in table sprintf(g->Message, MSG(COL_ISNOT_TABLE), Picol, Tabname); return true; } else if (Xcolp->InitValue(g)) return true; // Check and initialize the subtable columns for (PCOL cp = Columns; cp; cp = cp->GetNext()) if (cp->GetAmType() == TYPE_AM_SRC) { if (((PSRCCOL)cp)->Init(g)) return TRUE; } else if (cp->GetAmType() == TYPE_AM_FNC) if (((PFNCCOL)cp)->InitColumn(g)) return TRUE; } // endif isview return false; } // end of MakePivotColumns
int TDBPIVOT::ReadDB(PGLOBAL g) { int rc = RC_OK; bool newrow = FALSE; PCOL colp; if (FileStatus == 2) return RC_EF; if (FileStatus) for (colp = Columns; colp; colp = colp->GetNext()) if (colp->GetAmType() == TYPE_AM_SRC) ((PSRCCOL)colp)->SetColumn(); // New row, reset all function column values for (colp = Columns; colp; colp = colp->GetNext()) if (colp->GetAmType() == TYPE_AM_FNC) colp->GetValue()->Reset(); /*********************************************************************/ /* Now start the multi reading process. */ /*********************************************************************/ do { if (RowFlag != 1) { if ((rc = Tdbp->ReadDB(g)) != RC_OK) { if (FileStatus && rc == RC_EF) { // A prepared row remains to be sent FileStatus = 2; rc = RC_OK; } // endif FileStatus break; } // endif rc for (colp = Tdbp->GetColumns(); colp; colp = colp->GetNext()) colp->ReadColumn(g); for (colp = Columns; colp; colp = colp->GetNext()) if (colp->GetAmType() == TYPE_AM_SRC) if (FileStatus) { if (((PSRCCOL)colp)->CompareLast()) { newrow = (RowFlag) ? TRUE : FALSE; break; } // endif CompareLast } else ((PSRCCOL)colp)->SetColumn(); FileStatus = 1; } // endif RowFlag if (newrow) { RowFlag = 1; break; } else RowFlag = 2; // Look for the column having this header for (colp = Columns; colp; colp = colp->GetNext()) if (colp->GetAmType() == TYPE_AM_FNC) { if (((PFNCCOL)colp)->CompareColumn()) break; } // endif AmType if (!colp && !(colp = Dcolp)) { if (!Accept) { strcpy(g->Message, MSG(NO_MATCH_COL)); return RC_FX; } else continue; } // endif colp // Set the value of the matching column from the fonction value colp->GetValue()->SetValue_pval(Fcolp->GetValue()); } while (RowFlag == 2); N++; return rc; } // end of ReadDB
char *TDBWMI::MakeWQL(PGLOBAL g) { char *colist, *wql/*, *pw = NULL*/; int len, ncol = 0; bool first = true, noloc = false; PCOL colp; // Normal WQL statement to retrieve results for (colp = Columns; colp; colp = colp->GetNext()) if (!colp->IsSpecial() && (colp->GetColUse(U_P | U_J_EXT) || noloc)) ncol++; if (ncol) { colist = (char*)PlugSubAlloc(g, NULL, (NAM_LEN + 4) * ncol); for (colp = Columns; colp; colp = colp->GetNext()) if (!colp->IsSpecial()) { if (colp->GetResultType() == TYPE_DATE) ((DTVAL*)colp->GetValue())->SetFormat(g, "YYYYMMDDhhmmss", 19); if (colp->GetColUse(U_P | U_J_EXT) || noloc) { if (first) { strcpy(colist, colp->GetName()); first = false; } else strcat(strcat(colist, ", "), colp->GetName()); } // endif ColUse } // endif Special } else { // ncol == 0 can occur for queries such that sql count(*) from... // for which we will count the rows from sql * from... colist = (char*)PlugSubAlloc(g, NULL, 2); strcpy(colist, "*"); } // endif ncol // Below 14 is length of 'select ' + length of ' from ' + 1 len = (strlen(colist) + strlen(Wclass) + 14); len += (To_CondFil ? strlen(To_CondFil->Body) + 7 : 0); wql = (char*)PlugSubAlloc(g, NULL, len); strcat(strcat(strcpy(wql, "SELECT "), colist), " FROM "); strcat(wql, Wclass); if (To_CondFil) strcat(strcat(wql, " WHERE "), To_CondFil->Body); return wql; } // end of MakeWQL