3c50219c313338bcac7b9a7dca454916ccc6af44 tdreszer Fri Mar 4 10:58:53 2011 -0800 Temporarily adding varType back into table definition. This should smoothe the transition of the CGIs, etc. until the non-varType APIs are fully out on the RR. diff --git src/hg/lib/mdb.c src/hg/lib/mdb.c index 4765c94..9833eb2 100644 --- src/hg/lib/mdb.c +++ src/hg/lib/mdb.c @@ -44,52 +44,52 @@ slReverse(&list); sqlFreeResult(&sr); return list; } void mdbSaveToDb(struct sqlConnection *conn, struct mdb *el, char *tableName, int updateSize) /* Save mdb as a row to the table specified by tableName. * As blob fields may be arbitrary size updateSize specifies the approx size * of a string that would contain the entire query. Arrays of native types are * converted to comma separated strings and loaded as such, User defined types are * inserted as NULL. Note that strings must be escaped to allow insertion into the database. * For example "autosql's features include" --> "autosql\'s features include" * If worried about this use mdbSaveToDbEscaped() */ { struct dyString *update = newDyString(updateSize); -dyStringPrintf(update, "insert into %s values ( '%s','%s',%s)", +dyStringPrintf(update, "insert into %s set obj='%s', var='%s', val='%s'", tableName, el->obj, el->var, el->val); sqlUpdate(conn, update->string); freeDyString(&update); } void mdbSaveToDbEscaped(struct sqlConnection *conn, struct mdb *el, char *tableName, int updateSize) /* Save mdb as a row to the table specified by tableName. * As blob fields may be arbitrary size updateSize specifies the approx size. * of a string that would contain the entire query. Automatically * escapes all simple strings (not arrays of string) but may be slower than mdbSaveToDb(). * For example automatically copies and converts: * "autosql's features include" --> "autosql\'s features include" * before inserting into database. */ { struct dyString *update = newDyString(updateSize); char *obj, *var, *val; obj = sqlEscapeString(el->obj); var = sqlEscapeString(el->var); val = sqlEscapeString(el->val); -dyStringPrintf(update, "insert into %s values ( '%s','%s','%s')", +dyStringPrintf(update, "insert into %s set obj='%s', var='%s', val='%s'", tableName, obj, var, val); sqlUpdate(conn, update->string); freeDyString(&update); freez(&obj); freez(&var); freez(&val); } struct mdb *mdbLoad(char **row) /* Load a mdb from row fetched with select * from mdb * from database. Dispose of this with mdbFree(). */ { struct mdb *ret; AllocVar(ret); @@ -843,39 +843,54 @@ verbose(3,"Objects magic: %d Files magic: %d (%s)\n",objsMagic,fileMagic,line+strlen(MDB_MAGIC_PREFIX)); *validated = (fileMagic == objsMagic); } else verbose(3,"Can't find magic number on this file.\n"); } return mdbObjs; } // ------ Table name and creation ------ void mdbReCreate(struct sqlConnection *conn,char *tblName,boolean testOnly) // Creates ore Recreates the named mdb. { char *sqlCreate = +#define MDB_STILL_HAS_VARTYPE +#ifdef MDB_STILL_HAS_VARTYPE "# Contains metadata for a table, file or other objects.\n" "CREATE TABLE %s (\n" " obj varchar(255) not null, # Object name or ID.\n" " var varchar(255) not null, # Metadata variable name.\n" +" varType enum ('txt','binary') # OBSOLETE All vars are txt\n" +" not null default 'txt',\n" " val varchar(2048) not null, # Metadata value.\n" " #Indices\n" " PRIMARY KEY(obj,var),\n" " INDEX varKey (var,val(32),obj)\n" ")"; +#else///ifndef MDB_STILL_HAS_VARTYPE +"# Contains metadata for a table, file or other objects.\n" +"CREATE TABLE %s (\n" +" obj varchar(255) not null, # Object name or ID.\n" +" var varchar(255) not null, # Metadata variable name.\n" +" val varchar(2048) not null, # Metadata value.\n" +" #Indices\n" +" PRIMARY KEY(obj,var),\n" +" INDEX varKey (var,val(32),obj)\n" +")"; +#endif///ndef MDB_STILL_HAS_VARTYPE if(sqlTableExists(conn,tblName)) verbose(2, "Table '%s' already exists. It will be recreated.\n",tblName); struct dyString *dy = newDyString(512); dyStringPrintf(dy, sqlCreate, tblName); verbose(2, "Requesting table creation:\n%s;\n", dyStringContents(dy)); if(!testOnly) sqlRemakeTable(conn, tblName, dyStringContents(dy)); dyStringFree(&dy); } static char*mdbTableNamePreferSandbox() // returns the mdb table name or NULL if conn supplied but the table doesn't exist @@ -1046,31 +1061,31 @@ "update %s set val = '%s' where obj = '%s' and var = '%s'", tableName, sqlEscapeString(mdbVar->val), mdbObj->obj,mdbVar->var); verbose(2, "Requesting update of 1 row:\n\t%s;\n",query); if(!testOnly) sqlUpdate(conn, query); count++; } mdbObjsFree(&objExists); continue; // The object was found/updated so done with it } } // Finally ready to insert new vars safef(query, sizeof(query), - "insert into %s values ( '%s','%s','%s')", + "insert into %s set obj='%s', var='%s', val='%s'", tableName,mdbObj->obj,mdbVar->var, sqlEscapeString(mdbVar->val)); // FIXME Strip quotes verbose(2, "Requesting insert of one row:\n\t%s;\n",query); if(!testOnly) sqlUpdate(conn, query); count++; } } return count; } int mdbObjsLoadToDb(struct sqlConnection *conn,char *tableName,struct mdbObj *mdbObjs,boolean testOnly) // Adds mdb Objs with minimal error checking { int count = 0; @@ -1486,31 +1501,35 @@ { FILE *tabFile = mustOpen(file, "w"); int count = 0; struct mdbObj *mdbObj = NULL; for(mdbObj=mdbObjs;mdbObj!=NULL;mdbObj=mdbObj->next) { if(mdbObj->obj == NULL) continue; struct mdbVar *mdbVar = NULL; for(mdbVar=mdbObj->vars;mdbVar!=NULL;mdbVar=mdbVar->next) { if (mdbVar->var == NULL || mdbVar->val == NULL) continue; +#ifdef MDB_STILL_HAS_VARTYPE + fprintf(tabFile, "%s\t%s\ttxt\t%s\n",mdbObj->obj,mdbVar->var,sqlEscapeString(mdbVar->val)); +#else///ifndef MDB_STILL_HAS_VARTYPE fprintf(tabFile, "%s\t%s\t%s\n",mdbObj->obj,mdbVar->var,sqlEscapeString(mdbVar->val)); +#endif///ndef MDB_STILL_HAS_VARTYPE count++; } } fclose(tabFile); return count; } void mdbByVarPrint(struct mdbByVar *mdbByVars,boolean raStyle) // prints var=val pairs and objs that go with them single lines or ra style { // Single line: // mdbVariable lucy=ethyl bestFriends lifePartners // mdbVariable lucy=ricky iLoveLucy divorces // NOT QUITE ra style