- implemented __builtin_(ffs|ctz|clz|popcount|parity)
[libfirm] / scripts / statev_sql.py
index 8b8db52..b8b2bab 100755 (executable)
@@ -5,9 +5,6 @@ import os
 import re
 import time
 import stat
-import profile
-import sqlite3
-import MySQLdb
 import fileinput
 import tempfile
 import optparse
@@ -24,7 +21,7 @@ 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
 
@@ -43,6 +40,8 @@ class EmitMysqlInfile(EmitBase):
                return res
 
        def __init__(self, options, tables, ctxcols, evcols):
+               import MySQLdb
+
                args = dict()
                if options.password:
                        args['passwd'] = options.password
@@ -72,8 +71,10 @@ class EmitMysqlInfile(EmitBase):
                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', ''))
+               table_ctx = self.create_table(self.ctxcols, self.ctxtab, 'char(80)', 'unique')
+               c.execute(table_ctx)
+               table_ev = self.create_table(self.evcols, self.evtab, 'double default null', '')
+               c.execute(table_ev)
                self.conn.commit()
 
                if options.verbose:
@@ -119,14 +120,24 @@ class EmitMysqlInfile(EmitBase):
 
 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 = ['?']
@@ -136,13 +147,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):
@@ -152,19 +179,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
 
@@ -173,7 +201,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 +215,7 @@ class Conv:
                lineno     = 0
                ids        = 0
                curr_id    = 0
+               last_push_curr_id = 0
                keystack   = []
                idstack    = []
                curr_event = 0
@@ -202,7 +231,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 +239,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