#!/usr/bin/python # Database script runner # Copyright 2007 Svenne Krap # License ASL 2.0 # # Usage: # - ensure you have a file named DATABASE that contains the name of your target db # ie "echo project_test > DATABASE" # - remember to exclude it from your SCM # ie. "echo DATABASE >> .gitignore" (if using git) # - if you want to run it in normal mode you need a file called PRODMODE # ie. "touch PRODMODE" # # Files needs to be called nnnn_XXXXXXX.sql (or use sqledit) # i.e. any amount of digits (0-9) followed by one underscore followed by some # string followed by ".sql" # # Run the command as rundb nnnn # import sys import os import time PAGER = os.environ.get('PAGER', 'more') argc = len(sys.argv) try: db = open("DATABASE","r").read().strip() except: print "Need database name in file DATABASE" sys.exit(1) files = os.listdir('.') files.sort() mode = "unknown" if 'DIAGMODE' in files: mode = "diag" if 'PRODMODE' in files: mode = "prod" if mode=="unknown": print "Unable to determine DIAGMODE or PRODMODE. Please touch appropriate file in run-dir" sys.exit(0); try: os.chdir("output") except: os.mkdir("output") os.chdir("output") os.chdir("..") rt = time.localtime() logfile = "output/run_" + time.strftime("%Y-%m-%d-%H-%M-%S",rt) + ".log" if argc < 2 or argc > 3: print "Syntax: rundb.py [exclude_tags]" print print "dbname = name of database" print "from = integer of first command" print "exclude_tags = comma separated list of strings in filename to exclude" if argc == 1: print "Log is written to " + logfile os.system("psql -d %s -e -L %s" % (db,logfile) ) print "Log was written to " + logfile sys.exit(0) sys.exit(1) def db_run_file(db,f,logfile): os.system("echo \"###RESULT### %s\" >>%s 2>&1" % (f,logfile)) os.system("psql --single-transaction -d %s -f %s >>%s 2>&1" % (db,f,logfile) ) os.system("echo \"###RUN### %s\" >>%s 2>&1" % (f,logfile)) os.system("cat %s >>%s 2>&1" % (f,logfile) ) if argc >= 3: exclude_tags = sys.argv[2].strip().split(",") else: exclude_tags = [] if mode=='prod': run_from = int(sys.argv[1]) for f in files: good = True if not f.endswith(".sql"): continue pos = f.find("_") if pos == -1: continue first = f[:pos] try: num = int(first) except: num = int(first[:-1]) if num < run_from: continue for x in exclude_tags: if not f.find(x) == -1: good = False break if good == False: continue db_run_file(db,f,logfile) elif mode=='diag': filename = sys.argv[1] if os.path.exists(filename) and os.path.isfile(filename): db_run_file(db,filename,logfile) if os.path.exists(logfile): os.system('%s %s' % (PAGER, logfile))