X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=scripts%2Fstatev_sql.py;h=7c88947b83a35e19c57a333ba4b2beb0d4456a39;hb=e2e929ea04eb563b5fffadfd84bd61eb1f85735f;hp=5029fb0cb0a9eb46f359147e6c08f8a5cc23354e;hpb=9d59e06e77cff962781c81a844a84d1c86dc9277;p=libfirm diff --git a/scripts/statev_sql.py b/scripts/statev_sql.py index 5029fb0cb..7c88947b8 100755 --- a/scripts/statev_sql.py +++ b/scripts/statev_sql.py @@ -21,23 +21,18 @@ class EmitBase: for x in cols.iterkeys(): sorted[cols[x]] = x for x in sorted: - create += (', %s %s' % (x, type)) + create += (", `%s` %s" % (x, type)) create += ');' return create class EmitMysqlInfile(EmitBase): tmpfile_mode = stat.S_IREAD | stat.S_IROTH | stat.S_IWUSR - def ex(self, args, tab, fname): - res = os.fork() - if res == 0: - stmt = """load data infile '%s' into table %s fields terminated by ';'""" % (fname, tab) - conn = MySQLdb.connect(**args) - c = conn.cursor() - c.execute(stmt) - conn.commit() - sys.exit(0) - return res + def execute(self, query): + c = self.conn.cursor() + print query + "\n"; + c.execute(query); + self.conn.commit() def __init__(self, options, tables, ctxcols, evcols): import MySQLdb @@ -68,66 +63,74 @@ class EmitMysqlInfile(EmitBase): os.chmod(self.evfifo, self.tmpfile_mode) os.chmod(self.ctxfifo, self.tmpfile_mode) - c = self.conn.cursor() - c.execute('drop table if exists ' + self.evtab) - c.execute('drop table if exists ' + self.ctxtab) - c.execute(self.create_table(self.ctxcols, self.ctxtab, 'char(80)', 'unique')) - c.execute(self.create_table(self.evcols, self.evtab, 'double default null', '')) - self.conn.commit() + self.execute('drop table if exists ' + self.evtab) + self.execute('drop table if exists ' + self.ctxtab) + table_ctx = self.create_table(self.ctxcols, self.ctxtab, 'char(80)', '') + self.execute(table_ctx) + table_ev = self.create_table(self.evcols, self.evtab, 'double default null', '') + self.execute(table_ev) if options.verbose: print 'go for gold' - self.pidev = self.ex(args, self.evtab, self.evfifo) - self.pidctx = self.ex(args, self.ctxtab, self.ctxfifo) - - if options.verbose: - print "forked two mysql leechers: %d, %d" % (self.pidev, self.pidctx) - - self.evfile = open(self.evfifo, 'w+t') - self.ctxfile = open(self.ctxfifo, 'w+t') - - if options.verbose: - print 'fifo: %s, %o' % (self.evfile.name, os.stat(self.evfile.name).st_mode) - print 'fifo: %s, %o' % (self.ctxfile.name, os.stat(self.ctxfile.name).st_mode) + n = max(len(ctxcols), len(evcols)) + 1 + q = [] + self.quests = [] + for i in xrange(0, n): + self.quests.append(','.join(q)) + q.append('%s') def ev(self, curr_id, evitems): - field = ['\N'] * len(self.evcols) - for key, val in evitems.iteritems(): - index = self.evcols[key] - field[index] = val - print >> self.evfile, ('%d;' % curr_id) + ';'.join(field) - - def ctx(self, curr_id, ctxitems): - field = ['\N'] * len(self.ctxcols) - for key, val in ctxitems.iteritems(): - index = self.ctxcols[key] - field[index] = val - print >> self.ctxfile, ('%d;' % curr_id) + ';'.join(field) + keys = "" + first = True + for key in evitems.keys(): + if first: + first = False + else: + keys += ", " + keys += "`%s`" % (key) - def commit(self): - self.evfile.close() - self.ctxfile.close() + stmt = "insert into `%s` (id, %s) values (%s)" % (self.evtab, keys, self.quests[len(evitems)+1]) + c = self.conn.cursor() + c.execute(stmt, (curr_id,) + tuple(evitems.values())) - os.waitpid(self.pidev, 0) - os.waitpid(self.pidctx, 0) + def ctx(self, curr_id, ctxitems): + keys = "" + first = True + for key in ctxitems.keys(): + if first: + first = False + else: + keys += ", " + keys += "`%s`" % (key) - os.unlink(self.evfile.name) - os.unlink(self.ctxfile.name) + stmt = "insert into `%s` (id, %s) values (%s)" % (self.ctxtab, keys, self.quests[len(ctxitems)+1]) + c = self.conn.cursor() + c.execute(stmt, (curr_id,) + tuple(ctxitems.values())) + def commit(self): + self.conn.commit() class EmitSqlite3(EmitBase): def __init__(self, options, tables, ctxcols, evcols): import sqlite3 + if options.database == None: + print "Have to specify database (file-)name for sqlite" + sys.exit(1) + if os.path.isfile(options.database): os.unlink(options.database) self.ctxtab = tables['ctx'] self.evtab = tables['ev'] self.conn = sqlite3.connect(options.database) - self.conn.execute(self.create_table(ctxcols, self.ctxtab, 'text', 'unique')) - self.conn.execute(self.create_table(evcols, self.evtab, 'double', '')) + table_ctx = self.create_table(ctxcols, self.ctxtab, 'text', 'unique') + self.conn.execute(table_ctx) + self.conn.execute("CREATE INDEX IF NOT EXISTS ctxindex ON ctx(id)") + table_ev = self.create_table(evcols, self.evtab, 'double', '') + self.conn.execute(table_ev) + self.conn.execute("CREATE INDEX IF NOT EXISTS evindex ON ev(id)") n = max(len(ctxcols), len(evcols)) + 1 q = ['?'] @@ -137,13 +140,29 @@ class EmitSqlite3(EmitBase): q.append('?') def ev(self, curr_id, evitems): - keys = ','.join(evitems.keys()) - stmt = 'insert into %s (id, %s) values (%s)' % (self.evtab, keys, self.quests[len(evitems)]) + keys = "" + first = True + for key in evitems.keys(): + if first: + first = False + else: + keys += ", " + keys += "`%s`" % (key) + + stmt = "insert into `%s` (id, %s) values (%s)" % (self.evtab, keys, self.quests[len(evitems)]) self.conn.execute(stmt, (curr_id,) + tuple(evitems.values())) def ctx(self, curr_id, ctxitems): - keys = ','.join(ctxitems.keys()) - stmt = 'insert into %s (id, %s) values (%s)' % (self.ctxtab, keys, self.quests[len(ctxitems)]) + keys = "" + first = True + for key in ctxitems.keys(): + if first: + first = False + else: + keys += ", " + keys += "`%s`" % (key) + + stmt = "insert into `%s` (id, %s) values (%s)" % (self.ctxtab, keys, self.quests[len(ctxitems)]) self.conn.execute(stmt, (curr_id,) + tuple(ctxitems.values())) def commit(self): @@ -153,19 +172,20 @@ class Conv: engines = { 'sqlite3': EmitSqlite3, 'mysql': EmitMysqlInfile } def find_heads(self): n_ev = 0 - ctxind = 0 - evind = 0 - ctxcols = dict() - evcols = dict() + ctxind = 0 + evind = 0 + ctxcols = dict() + evcols = dict() self.valid_keys = set() - for line in self.input(): - heads = None + inp = self.input() + + for line in inp: if line[0] == 'P': ind = line.index(';', 2) key = line[2:ind] - if not key in ctxcols: + if not ctxcols.has_key(key): ctxcols[key] = ctxind ctxind += 1 @@ -174,7 +194,7 @@ class Conv: key = line[2:ind] if self.filter.match(key): self.n_events += 1 - if not key in evcols: + if not evcols.has_key(key): self.valid_keys.add(key) evcols[key] = evind evind += 1 @@ -188,6 +208,7 @@ class Conv: lineno = 0 ids = 0 curr_id = 0 + last_push_curr_id = 0 keystack = [] idstack = [] curr_event = 0 @@ -203,7 +224,7 @@ class Conv: if op == 'P': # flush the current events if len(evcols): - self.emit.ev(curr_id, evcols) + self.emit.ev(last_push_curr_id, evcols) evcols.clear() # push the key @@ -211,6 +232,7 @@ class Conv: val = items[2] keystack.append(key) curr_id = ids + last_push_curr_id = curr_id ids += 1 idstack.append(curr_id) ctxcols[key] = val