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
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
PCOL TDBASE::InsertSpecialColumn(PCOL colp) { if (!colp->IsSpecial()) return NULL; colp->SetNext(Columns); Columns = colp; return colp; } // end of InsertSpecialColumn
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
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