#!/usr/bin/env python
#
# parse register.log and create reglog.db
#
# please first test and fix your register.log, then
# try writing to database.
#
# Create: piaip
# python 2.5:
#import sqlite3
# python 2.4 or prior:
from pysqlite2 import dbapi2 as sqlite3
import sys
import time
def initdb(dbfn) :
db = sqlite3.connect(dbfn)
c = db.cursor()
# separate the tables to 'approved' and 'rejected',
# since the 'rejected' is rarely used...
c.execute('create table if not exists approved ' +
'(uid text, name text, career text, ' +
' addr text, phone text, date integer, approved text)');
c.execute('create table if not exists rejected ' +
'(uid text, name text, career text, ' +
' addr text, phone text, date integer, rejected text)');
return (db, c)
def processblk(m) :
#print "process blk!"
if not m.has_key('uid') :
print "no uid record at line: ", lineno
sys.exit(-1)
if (not m.has_key('approved')) and (not m.has_key('rejected')) :
print "invalid record (action?) at line: ", lineno
sys.exit(-1)
if c != None :
type = 'rejected';
if m.has_key('approved') : type = 'approved';
# write into database
sql = 'insert into ' + type + ' values (?,?,?,?,?,?,?)';
# follow the orders
c.execute(sql, (m['uid'], m['name'], m['career'], m['addr'], m['phone'], m['date'], m[type]));
# default input
fn = "register.log"
dbfn= ""
db = None
c = None
if len (sys.argv) < 1 :
print "syntax:", sys.argv[0], "register.log [reglog.db]"
sys.exit(0)
if len (sys.argv) > 1 :
fn = sys.argv[1]
if len (sys.argv) > 2 :
dbfn = sys.argv[2]
print "Opening ", fn, "..."
f = open(fn, "rt")
if dbfn != '' :
(db, c) = initdb(dbfn)
m={}
lineno = 0
tickets = 0
for s in f :
lineno = lineno +1
# for each line...
if s.startswith("num:") : continue
if s.startswith("email:") : continue
if s.startswith("ident:") : continue
if s.startswith("]") : continue
if s.startswith("----") :
# ready to build new one
processblk(m)
m = {}
tickets = tickets +1
if tickets % 10000 == 0 :
if db : db.commit()
print tickets, "forms processed."
continue
v = s.split(': ', 1)
if len(v) != 2 :
print "error at line ", lineno
sys.exit(-1)
k = v[0].lower()
if (m.has_key(k)) :
print "key duplicated at line ", lineno
sys.exit(-1)
# convert timestamp
v = v[1].strip()
if (k == 'date') :
# strip final weekday
v = v.split(' ') # mdy HMS abrv
if len(v) < 2 or len(v) > 3 :
print "invalid date entry at line ", lineno
sys.exit(-1)
v = v[0] + ' ' + v[1]
# build timestamp
v = int(time.mktime(time.strptime(v, "%m/%d/%Y %H:%M:%S")))
m[k] = v
f.close()
# vim:sw=4:expandtab