src/hg/makeDb/mdbUpdate/mdbUpdate.c 1.3
1.3 2010/04/27 22:40:12 tdreszer
Renamed mdb to metaDb
Index: src/hg/makeDb/mdbUpdate/mdbUpdate.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/makeDb/mdbUpdate/mdbUpdate.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -b -B -U 1000000 -r1.2 -r1.3
--- src/hg/makeDb/mdbUpdate/mdbUpdate.c 15 Apr 2010 19:26:54 -0000 1.2
+++ src/hg/makeDb/mdbUpdate/mdbUpdate.c 27 Apr 2010 22:40:12 -0000 1.3
@@ -1,291 +1,291 @@
/* mdbUpdate - Adds, updates or removes metadata objects and variables from the 'mdb' metadata table. */
#include "common.h"
#include "linefile.h"
#include "options.h"
#include "mdb.h"
#include "hash.h"
static char const rcsid[] = "$Id$";
#define OBJTYPE_DEFAULT "table"
void usage()
/* Explain usage and exit. */
{
errAbort(
- "mdbUpdate - Adds, updates or removes metadata objects and variables from the 'mdb' metadata table.\n"
+ "mdbUpdate - Adds, updates or removes metadata objects and variables from the '" MDB_DEFAULT_NAME "' metadata table.\n"
"usage:\n"
" mdbUpdate {db} [-table= [-force]] [-recreate] [-test [-verbose=2]]\n"
" [-obj= [-type=] [-delete] [-var=] [-binary] [-val=]]\n"
" [-vars=\"var1=val1 var2=val2... [-delete] [-var=] [-binary] [-val=]]\n"
" [{fileName}] [-replace]\n"
"Options:\n"
" {db} Database to update metadata in. This argument is required.\n"
" -table Table to update metadata to. Default is the sandbox version of\n"
" '" MDB_DEFAULT_NAME "'.\n"
" -recreate Creates or empties the table. No further arguemts are needed.\n"
" -force Overrides restrictions placed on shared '" MDB_DEFAULT_NAME "'.\n"
" -test Does not update but only reports results. Use with -verbose=2 to see SQL.\n"
" if {fileName} argument not provided, then -obj or -vars must be provided\n"
" -obj={objName} Update this single object from the command lineas :\n"
" -vars={var=val...} Apply update to group of objects matching these restrictions.\n"
" It is recommended you test the selection criteria with mdbPrint\n"
" to verify which objects meet your selection criteria first.\n"
" Use of 'var!=val', 'var=v%%' and 'var=?' are supported.\n"
" These options work on objects selected with -obj or -vars:\n"
" -delete Remove a specific var or entire obj (if -var not provided).\n"
" -var={varName} Provide variable name (if no -var then must be -delete)\n"
" -binary NOT YET IMPLEMENTED. This var has a binary val and -val={file}\n"
" -val={value} (Enclosed in \"quotes if necessary\".) Not required to delete var\n"
" -setVars={var=val...} Allows setting multiple var=val pairs.\n"
" [{fileName}] File containing formatted metadata lines. (Ignored if -obj or -vars used).\n"
" -replace Means remove all old variables for each object before adding new variables\n\n"
"There are two ways to call mdbUpdate. The object (or objects matching vars) and var to update "
"can be declared on the command line, or a file of formatted metadata lines can be provided. "
"The file can be the formatted output from mdbPrint or the following special formats:\n"
" metadata objName var1=val1 var2=\"val2 with spaces\" var3=...\n"
" Adds or updates the specific object and variables\n"
" metadata objName delete\n"
" delete all metadata for objName\n"
" metadata objName delete var=val var2=val2\n"
" deletes specifically named variables for objName. (Must provide val but value is ignored).\n"
" Special ENCODE format as produced by the doEncodeValidate.pl\n"
"NOTE: Updates to the shared '" MDB_DEFAULT_NAME "' can only be done by a file written\n"
" directly from mdbPrint. Update sandbox first, then move updates to shared table.\n"
"HINT: Use '%%' in any command line obj, var or val as a wildcard for selection.\n\n"
"Examples:\n"
" mdbUpdate hg19 -vars=\"grant=Snyder cell=GM12878 antibody=CTCF\" -var=expId -val=1427\n"
" Update all objects matcing Snyder/GM12878/CTCF and set the expId=1472.\n"
" mdbUpdate hg19 -obj=fredsTable -var=description val=\"Ethyl's husband's clutter\"\n"
" Updates fredsTable with a description.\n"
" mdbUpdate mm9 -table=mdb_braney -recreate\n"
" Creates or empties the named metadata table.\n"
" mdbUpdate hg18 -test vars=\"composite=wgEncodeDukeDNase\" -delete\n"
" Tests the delete of all objects that have the named composite defined.\n"
- " mdbUpdate hg18 -table=mdb encBroadHistone.mdb.ra -replace\n"
- " Replaces all metadata for objects found in the provided file.\n"
+ " mdbUpdate hg18 -table=" MDB_DEFAULT_NAME " mdbBroadHistone.ra -replace\n"
+ " Replaces all metadata in the shared table for objects found in the provided file.\n"
" File must have been printed with mdbPrint.\n"
);
}
static struct optionSpec optionSpecs[] = {
- {"table", OPTION_STRING}, // default "mdb"
+ {"table", OPTION_STRING}, // default "metaDb"
{"obj", OPTION_STRING}, // objName or objId
{"vars", OPTION_STRING}, // Select set of object by vars
{"var", OPTION_STRING}, // variable
{"val", OPTION_STRING}, // value
{"setVars", OPTION_STRING}, // Allows setting multiple var=val pairs
{"delete", OPTION_BOOLEAN},// delete one obj or obj/var
{"binary", OPTION_BOOLEAN},// val is binary (NOT YET IMPLEMENTED) implies -val={file}
{"replace", OPTION_BOOLEAN},// replace entire obj when loading from file
{"recreate",OPTION_BOOLEAN},// creates or recreates the table
{"force", OPTION_BOOLEAN},// override restrictions on shared table
{"test", OPTION_BOOLEAN},// give it a test, will ya?
{NULL, 0}
};
int main(int argc, char *argv[])
// Process command line.
{
if(argc == 1)
usage();
struct mdbObj * mdbObjs = NULL;
optionInit(&argc, argv, optionSpecs);
if(argc < 2)
{
verbose(1, "REQUIRED 'DB' argument not found:\n");
usage();
}
char *db = argv[1];
char *table = optionVal("table",NULL);
boolean deleteIt = optionExists("delete");
boolean testIt = optionExists("test");
boolean recreate = optionExists("recreate");
boolean force = optionExists("force");
boolean replace = FALSE;
char *var = optionVal("var",NULL);
char *val = optionVal("val",NULL);
char *setVars = optionVal("setVars",NULL);
struct sqlConnection *conn = sqlConnect(db);
// Find the table if necessary
if(table == NULL)
{
table = mdbTableName((recreate?NULL:conn),TRUE); // Look for sandBox name first
if(table == NULL)
{
table = mdbTableName((recreate?NULL:conn),FALSE); // Okay, default then
if(table == NULL) // Now you are just getting me angry!
{
sqlDisconnect(&conn);
if(!recreate) // assertable
errAbort("No '%s.%s' found. Consider using -recreate flag.\n",db,MDB_DEFAULT_NAME);
else
errAbort("No '%s.%s' found.\n",db,MDB_DEFAULT_NAME);
}
}
verbose(1, "Using table named '%s.%s'.\n",db,table);
}
boolean sharedTbl = sameWord(table,MDB_DEFAULT_NAME); // Special restrictions apply
// Recreate the table
if(recreate)
{
if(sharedTbl && ! force)
{
sqlDisconnect(&conn);
errAbort("NOT SUPPORTED for shared table '%s'.\n",MDB_DEFAULT_NAME);
}
boolean recreated = sqlTableExists(conn,table);
mdbReCreate(conn,table,testIt);
if(testIt)
{
verbose(1, "Would %screate table named '%s'.\n",
(recreated?"re":""),table);
if(!recreated)
{
sqlDisconnect(&conn);
if(optionExists("obj") || optionExists("vars") || argc > 2)
verbose(1, "Can't test further commands. Consider '-db= [-table=] -recreate' as the only arguments.\n");
return 0; // Don't test any update if we haven't actually created the table!
}
}
else
verbose(1, "%s table named '%s'.\n",(recreated?"Recreated":"Created"),table);
}
if(argc > 2 && (deleteIt || var != NULL || val != NULL || setVars != NULL))
{
verbose(1, "INCONSISTENT REQUEST: can't combine supplied file with -delete, -var, -val or -setVars.\n");
usage();
}
if(deleteIt && var != NULL && val != NULL)
{
verbose(1, "INCONSISTENT REQUEST: can't combine -delete with -var and -val.\n");
usage();
}
if (argc != 3 && !deleteIt)
{
if(setVars == NULL && (var == NULL || val == NULL))
{
if(recreate) // no problem
return 0;
verbose(1, "INCONSISTENT REQUEST: need both -var and -val.\n");
usage();
}
else if (setVars != NULL && (var != NULL || val != NULL))
{
if(recreate) // no problem
return 0;
verbose(1, "INCONSISTENT REQUEST: can't combin -var or -val with -setVars.\n");
usage();
}
}
// Now get the object list
if(optionExists("obj"))
{
if(sharedTbl && !force)
{
sqlDisconnect(&conn);
verbose(1, "NOT SUPPORTED for shared table '%s'.\n",MDB_DEFAULT_NAME);
usage(); // Must not have submitted formatted file also
}
if(argc > 2 || optionExists("vars"))
{
sqlDisconnect(&conn);
verbose(1, "INCONSISTENT REQUEST: can't combine -obj with -vars or a supplied file.\n");
usage(); // Must not have submitted formatted file also
}
mdbObjs = mdbObjCreate(optionVal("obj", NULL),var,
(optionExists("binary") ? "binary" : "txt"), // FIXME: don't know how to deal with binary yet
val);
mdbObjs->deleteThis = deleteIt;
if(setVars != NULL)
mdbObjSwapVars(mdbObjs,setVars,deleteIt);
verbose(2, "metadata %s %s%s%s%s\n",
mdbObjs->obj,(mdbObjs->deleteThis ? "delete ":""),
(mdbObjs->vars && mdbObjs->vars->var!=NULL?mdbObjs->vars->var:""),
(mdbObjs->vars && mdbObjs->vars->val!=NULL?"=":""),
(mdbObjs->vars && mdbObjs->vars->val!=NULL?mdbObjs->vars->val:""));
}
else if(optionExists("vars"))
{
if(sharedTbl && !force)
{
sqlDisconnect(&conn);
verbose(1, "NOT SUPPORTED for shared table '%s'.\n",MDB_DEFAULT_NAME);
usage(); // Must not have submitted formatted file also
}
if(argc > 2)
{
sqlDisconnect(&conn);
verbose(1, "INCONSISTENT REQUEST: can't combine -vars with a supplied file.\n");
usage(); // Must not have submitted formatted file also
}
struct mdbByVar * mdbByVars = mdbByVarsLineParse(optionVal("vars", NULL));
mdbObjs = mdbObjsQueryByVars(conn,table,mdbByVars);
// replace all found vars but update request
if(setVars != NULL)
mdbObjSwapVars(mdbObjs,setVars,deleteIt);
else
mdbObjTransformToUpdate(mdbObjs,var,
(optionExists("binary") ? "binary" : "txt"), // FIXME: don't know how to deal with binary yet
val,deleteIt);
}
else // Must be submitting formatted file
{
if(argc != 3)
{
sqlDisconnect(&conn);
if(recreate) // no problem
return 0;
verbose(1, "REQUIRED: must declare -obj, -vars or supply a file.\n");
usage(); // Must not have submitted formatted file also
}
replace = optionExists("replace");
boolean validated = FALSE;
mdbObjs = mdbObjsLoadFromFormattedFile(argv[2],&validated);
if(sharedTbl && !force && !validated)
{
sqlDisconnect(&conn);
errAbort("Update to shared table '%s' requires file directly written by mdbPrint from sandbox file.\n", table);
}
if(mdbObjs != NULL)
verbose(1, "Read %d metadata objects from %s\n", slCount(mdbObjs),argv[1]);
}
int count = 0;
if(mdbObjs != NULL)
{
if(testIt && verboseLevel() > 2)
mdbObjPrint(mdbObjs,FALSE);
count = mdbObjsSetToDb(conn,table,mdbObjs,replace,testIt);
}
if(testIt)
verbose(1, "Command would affected %d row(s) in %s.%s\n", count,db,table);
else
verbose(1, "Affected %d row(s) in %s.%s\n", count,db,table);
sqlDisconnect(&conn);
mdbObjsFree(&mdbObjs);
return 0;
// TODO:
// 1) Case insensitive hashs?
// 2) -ra by default (-1 line)?
// 3) expId table? -exp=start requests generating unique ids for selected vars, then updating them. -expTbl generates expTable as id,"var=val var=val var=val"
}