#!/usr/bin/env python
# Author: Ben Bradley - bbradley406@gmail.com
# Program for making some changes to a sql file, i dunno
import sys
def ioerror(reason=None):
'''
Used to clean up when any of the file operations raise exceptions
'''
if reason:
if reason == 'input':
print ("Error: couldn't open input file for reading")
elif reason == 'output':
print ("Error: couldn't open output file for writing")
else:
print ("Error: cause unknown")
sys.exit(1)
def linenumber(filelinesarray, currentelement):
'''
If a file has been read into an array of lines with file.readlines()
it is useful to know which element corresponds to which line number.
'''
# Use str rather than int because linenumber() is always for printing
# saves many str() calls
return str(filelinesarray.index(currentelement)+1)
def insertafter(infilelines, targetline, conf):
'''
Use to insert statements, variables etc into an array of file lines
'''
# Pad with a newline just in case. Consider:
# )
# <some config>
# ;
# == vs ==
# )
# <some config>;
if type(conf).__name__ == 'str':
if conf.endswith('\n') == False:
conf += '\n'
for l in infilelines:
if l.lower().startswith(targetline.lower()):
# Comment out (or delete) print statements if ya want
print ('Target line "%s" found @ file line #%s' %
(targetline,
(linenumber(infilelines, l))))
print ('Inserting "%s" after file line #%s' %
(conf[:-1],
linenumber(infilelines, l)))
offset = infilelines.index(l)+1
if type(conf).__name__ == 'str':
infilelines.insert(offset, conf)
elif type(conf).__name__ == 'list':
for el in conf:
infilelines.insert(offset, el)
offset += 1
break
return infilelines
def do3changes(infilelines, confstring):
'''
Applies the necessary changes as specd by dad
'''
# Major config here; be careful
ALL_CHANGES = {")" : confstring,
" CONSTRAINT" : "using index local",
"CREATE INDEX" :"local"}
tmp = infilelines
for k in ALL_CHANGES:
# Rebinds tmp to the new value with change k applied
tmp = insertafter(tmp, k, ALL_CHANGES[k])
return tmp
def usage():
print "Usage: %s infile configstring outfile" % sys.argv[0]
def help():
print ("This is a glue script; just txt or email ben")
def version():
print ("This program won't get developed any more, so lets say 0.67")
def main():
'''
Handle args, run main functionality.
'''
if len(sys.argv) < 2:
usage()
elif 1 < len(sys.argv) < 4:
if '-h' in sys.argv or '--help' in sys.argv:
help(); usage()
if '-v' in sys.argv or '--version' in sys.argv:
version()
elif len(sys.argv) == 4:
try:
infile = open(sys.argv[1], 'r')
infilelines = infile.readlines()
infile.close()
except:
ioerror('input')
try:
insertfile = open(sys.argv[2], 'r')
insertlines = insertfile.readlines()
insertfile.close()
except:
ioerror()
try: outfile = open(sys.argv[3], 'w')
except: ioerror('output')
edited = do3changes(infilelines, insertlines)
try:
for line in edited:
outfile.write(line)
outfile.flush(); outfile.close()
except:
ioerror('output')
# God forbid anyone actually import this module, but just in case...
if __name__ == '__main__':
main()