really remove type_id
[libfirm] / scripts / statev_sql.py
index 04fc256..7c88947 100755 (executable)
@@ -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):
@@ -160,11 +179,13 @@ class Conv:
 
                self.valid_keys = set()
 
-               for line in self.input():
+               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
 
@@ -173,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
@@ -187,6 +208,7 @@ class Conv:
                lineno     = 0
                ids        = 0
                curr_id    = 0
+               last_push_curr_id = 0
                keystack   = []
                idstack    = []
                curr_event = 0
@@ -202,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
@@ -210,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