COLBLK::COLBLK(PCOL col1, PTDB tdbp) { PCOL colp; // Copy the old column block to the new one *this = *col1; Next = NULL; //To_Orig = col1; To_Tdb = tdbp; #ifdef DEBTRACE htrc(" copying COLBLK %s from %p to %p\n", Name, col1, this); #endif if (tdbp) // Attach the new column to the table block if (!tdbp->GetColumns()) tdbp->SetColumns(this); else { for (colp = tdbp->GetColumns(); colp->Next; colp = colp->Next) ; colp->Next = this; } // endelse } // end of COLBLK copy constructor
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
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
PTDB VCTDEF::GetTable(PGLOBAL g, MODE mode) { /*********************************************************************/ /* Allocate a TDB of the proper type. */ /* Column blocks will be allocated only when needed. */ /*********************************************************************/ // Mapping not used for insert (except for true VEC not split tables) // or when UseTemp is forced bool map = Mapped && (Estimate || mode != MODE_INSERT) && !(PlgGetUser(g)->UseTemp == TMP_FORCE && (mode == MODE_UPDATE || mode == MODE_DELETE)); PTXF txfp; PTDB tdbp; if (Multiple) { strcpy(g->Message, MSG(NO_MUL_VCT)); return NULL; } // endif Multiple if (Split) { if (map) txfp = new(g) VMPFAM(this); else txfp = new(g) VECFAM(this); } else if (Huge) txfp = new(g) BGVFAM(this); else if (map) txfp = new(g) VCMFAM(this); else txfp = new(g) VCTFAM(this); tdbp = new(g) TDBVCT(this, txfp); /*********************************************************************/ /* For block tables, get eventually saved optimization values. */ /*********************************************************************/ if (mode != MODE_INSERT) if (tdbp->GetBlockValues(g)) PushWarning(g, (PTDBASE)tdbp); // return NULL; // causes a crash when deleting index return tdbp; } // end of GetTable
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
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
PTDBASE TDBPRX::GetSubTable(PGLOBAL g, PTABLE tabp, bool b) { const char *sp = NULL; char *db, *name; bool mysql = true; PTDB tdbp = NULL; TABLE_SHARE *s = NULL; Field* *fp = NULL; PCATLG cat = To_Def->GetCat(); PHC hc = ((MYCAT*)cat)->GetHandler(); LPCSTR cdb, curdb = hc->GetDBName(NULL); THD *thd = (hc->GetTable())->in_use; db = (char*)tabp->GetQualifier(); name = (char*)tabp->GetName(); // Check for eventual loop for (PTABLE tp = To_Table; tp; tp = tp->Next) { cdb = (tp->Qualifier) ? tp->Qualifier : curdb; if (!stricmp(name, tp->Name) && !stricmp(db, cdb)) { sprintf(g->Message, "Table %s.%s pointing on itself", db, name); return NULL; } // endif } // endfor tp if (!tabp->GetSrc()) { if (!(s = GetTableShare(g, thd, db, name, mysql))) return NULL; if (s->is_view && !b) s->field = hc->get_table()->s->field; hc->tshp = s; } else if (b) { // Don't use caller's columns fp = hc->get_table()->field; hc->get_table()->field = NULL; // Make caller use the source definition sp = hc->get_table()->s->option_struct->srcdef; hc->get_table()->s->option_struct->srcdef = tabp->GetSrc(); } // endif srcdef if (mysql) { #if defined(MYSQL_SUPPORT) // Access sub-table via MySQL API if (!(tdbp= cat->GetTable(g, tabp, Mode, "MYPRX"))) { char buf[MAX_STR]; strcpy(buf, g->Message); sprintf(g->Message, "Error accessing %s.%s: %s", db, name, buf); hc->tshp = NULL; goto err; } // endif Define if (db) ((PTDBMY)tdbp)->SetDatabase(tabp->GetQualifier()); if (Mode == MODE_UPDATE || Mode == MODE_DELETE) tdbp->SetName(Name); // For Make_Command #else // !MYSQL_SUPPORT sprintf(g->Message, "%s.%s is not a CONNECT table", db, tblp->Name); goto err; #endif // MYSQL_SUPPORT } else { // Sub-table is a CONNECT table tabp->Next = To_Table; // For loop checking tdbp = cat->GetTable(g, tabp, Mode); } // endif mysql if (s) { if (s->is_view && !b) s->field = NULL; hc->tshp = NULL; } else if (b) { // Restore s structure that can be in cache hc->get_table()->field = fp; hc->get_table()->s->option_struct->srcdef = sp; } // endif s if (trace && tdbp) htrc("Subtable %s in %s\n", name, SVP(((PTDBASE)tdbp)->GetDef()->GetDB())); err: if (s) free_table_share(s); return (PTDBASE)tdbp; } // end of GetSubTable