diff --git a/doc/python.php b/doc/python.php index 516ea6b64e..aeaa5f2594 100644 --- a/doc/python.php +++ b/doc/python.php @@ -150,7 +150,7 @@ usage such as custom SQL queries (anything is possible :) see the pydoc.
   all_apps = database.Apps.find()
   finished_yeti_wus = database.Workunits.find(
-      app = database.Apps.find(name='YETI@home')[0]
+      app = database.Apps.find(name='YETI@home')[0],
       assimilate_state = ASSIMILATE_DONE)
 
diff --git a/py/Boinc/database.py b/py/Boinc/database.py index 3166d23093..33dcb1be54 100644 --- a/py/Boinc/database.py +++ b/py/Boinc/database.py @@ -304,14 +304,16 @@ class DatabaseObject: if key == 'id': # self.id = value continue - if not key in columns: + if key or key+'id' in columns: + if key.endswith('id'): + xkey = key[:-2] + self.__dict__[xkey] = self.id_lookups[xkey]._table[value] + else: + self.__dict__[key] = value + else: + # print '### columns=%s'%columns raise ValueError("database '%s' object doesn't take argument '%s'"%( self._table.table, key)) - elif key.endswith('id'): - xkey = key[:-2] - self.__dict__[xkey] = self.id_lookups[xkey]._table[value] - else: - self.__dict__[key] = value def do_init(self, kwargs): try: diff --git a/tools/add.py b/tools/add.py index d24ef9b2cc..2c92edd1d8 100755 --- a/tools/add.py +++ b/tools/add.py @@ -33,10 +33,9 @@ add.py workunit (TODO) add.py result (TODO) ''' import boinc_path_config -from Boinc import database, db_mid, util -import sys, os, getopt, md5, time - -database.connect_default_config() +from Boinc import database, db_mid, configxml +from Boinc.util import * +import sys, os, getopt, md5, time, pprint, shutil CREATE_TIME = ['?create_time', int(time.time())] @@ -68,12 +67,12 @@ class XAppVersion(database.AppVersion): xml_doc += ('\n'+ ' %s\n'+ ' %d\n') %( - self.name, self.version_num) + kwargs['app'].name, int(kwargs['version_num'])) first = True for exec_file in exec_files: xml_doc += (' \n'+ - ' %s\n') %( + ' %s\n') %( os.path.basename(exec_file)) if first: xml_doc += ' \n' @@ -112,7 +111,7 @@ def translate_arg(object, arg, value, args_dict): '''Translate various arguments''' database_table = None try: - database_table = database.__dict__[arg.capitalize]._table + database_table = database.__dict__[arg.capitalize()]._table except: pass if database_table: @@ -148,9 +147,12 @@ def translate_database_arg(database_table, arg, value): except: results = database_table.find(name=value) if len(results) == 0: - raise SystemExit('No %s %s found' %(arg,value)) + raise SystemExit('No %s "%s" found' %(arg,value)) if len(results) > 1: - raise SystemExit('Too many %s match "%s"'%(arg,value)) + print >>sys.stderr, 'Too many %ss match "%s": '%(arg,value) + for result in results: + print >>sys.stderr, ' ', result.name + raise SystemExit return results[0] def ambiguous_lookup(string, dict): @@ -248,16 +250,21 @@ def add_object(object, args): if not arg in args_dict: help_object(object, 'required argument --%s not given'%arg) - print "## args_dict=",args_dict - object = apply(object.DatabaseObject, [], args_dict) object.commit() - print "Committed", object + print "Committed", object, "with args:" + pprint.pprint(object.__dict__) def sign_executable(executable_path): '''Returns signed text for executable''' print 'Signing', executable_path - return os.popen('sign_executable %s %s'%(executable_path,config.config.code_sign_key)).read() + code_sign_key = os.path.join(config.config.key_dir, 'code_sign_private') + sign_executable_path = os.path.join(boinc_path_config.TOP_BUILD_DIR, + 'tools','sign_executable') + if not os.path.exists(sign_executable_path): + raise SystemExit("tools/sign_executable not found! did you `make' it?") + return os.popen('%s %s %s'%(sign_executable_path, + executable_path,code_sign_key)).read() class Dict: pass @@ -325,4 +332,8 @@ if len(possible_objects) > 1: args = sys.argv[2:] parse_global_options(args) + +config = configxml.default_config() +database.connect(config.config) + add_object(possible_objects[0], args)