Fix for SQL file glue script for dad

  1. #!/usr/bin/env python
  2.  
  3. # Author: Ben Bradley - bbradley406@gmail.com
  4. # Program for making some changes to a sql file, i dunno
  5.  
  6.  
  7. import sys
  8.  
  9. def ioerror(reason=None):
  10.         '''
  11.         Used to clean up when any of the file operations raise exceptions
  12.         '''
  13.         if reason:
  14.                 if reason == 'input':
  15.                         print ("Error: couldn't open input file for reading")
  16.                 elif reason == 'output':
  17.                         print ("Error: couldn't open output file for writing")
  18.         else:
  19.                 print ("Error: cause unknown")
  20.         sys.exit(1)
  21.  
  22.  
  23. def linenumber(filelinesarray, currentelement):
  24.         '''
  25.         If a file has been read into an array of lines with file.readlines()
  26.         it is useful to know which element corresponds to which line number.
  27.         '''
  28.         # Use str rather than int because linenumber() is always for printing
  29.         # saves many str() calls
  30.         return str(filelinesarray.index(currentelement)+1)
  31.  
  32.  
  33. def insertafter(infilelines, targetline, conf):
  34.         '''
  35.         Use to insert statements, variables etc into an array of file lines
  36.         '''
  37.         # Pad with a newline just in case. Consider:
  38.         # )
  39.         # <some config>
  40.         # ;
  41.         # == vs ==
  42.         # )
  43.         # <some config>;
  44.         if type(conf).__name__ == 'str':
  45.                 if conf.endswith('\n') == False:
  46.                         conf += '\n'
  47.  
  48.         for l in infilelines:
  49.                                
  50.                 if l.lower().startswith(targetline.lower()):
  51.                         # Comment out (or delete) print statements if ya want
  52.                         print ('Target line "%s" found @ file line #%s' %
  53.                                (targetline,
  54.                                 (linenumber(infilelines, l))))
  55.  
  56.                         print ('Inserting "%s" after file line #%s' %
  57.                                (conf[:-1],
  58.                                 linenumber(infilelines, l)))
  59.  
  60.                         offset = infilelines.index(l)+1
  61.                         if type(conf).__name__ == 'str':
  62.                                 infilelines.insert(offset, conf)
  63.                         elif type(conf).__name__ == 'list':
  64.                                 for el in conf:
  65.                                         infilelines.insert(offset, el)
  66.                                         offset += 1
  67.                         break
  68.  
  69.         return infilelines
  70.  
  71.  
  72. def do3changes(infilelines, confstring):
  73.         '''
  74.         Applies the necessary changes as specd by dad
  75.         '''
  76.         # Major config here; be careful
  77.         ALL_CHANGES = {")"              : confstring,
  78.                        "    CONSTRAINT" : "using index local",
  79.                        "CREATE INDEX"   :"local"}
  80.  
  81.         tmp = infilelines
  82.         for k in ALL_CHANGES:
  83.                 # Rebinds tmp to the new value with change k applied
  84.                 tmp = insertafter(tmp, k, ALL_CHANGES[k])
  85.         return tmp
  86.  
  87.  
  88. def usage():
  89.         print "Usage: %s infile configstring outfile" % sys.argv[0]
  90.  
  91. def help():
  92.         print ("This is a glue script; just txt or email ben")
  93.  
  94. def version():
  95.         print ("This program won't get developed any more, so lets say 0.67")
  96.        
  97.        
  98. def main():
  99.         '''
  100.         Handle args, run main functionality.
  101.         '''
  102.         if len(sys.argv) < 2:
  103.                 usage()
  104.        
  105.         elif 1 < len(sys.argv) < 4:
  106.                 if '-h' in sys.argv or '--help' in sys.argv:
  107.                         help(); usage()
  108.                 if '-v' in sys.argv or '--version' in sys.argv:
  109.                         version()
  110.  
  111.         elif len(sys.argv) == 4:
  112.                 try:
  113.                         infile = open(sys.argv[1], 'r')
  114.                         infilelines = infile.readlines()
  115.                         infile.close()
  116.                 except:
  117.                         ioerror('input')
  118.                
  119.                 try:
  120.                         insertfile = open(sys.argv[2], 'r')
  121.                         insertlines = insertfile.readlines()
  122.                         insertfile.close()
  123.                 except:
  124.                         ioerror()
  125.                
  126.                 try:    outfile = open(sys.argv[3], 'w')
  127.                 except: ioerror('output')
  128.                
  129.                 edited = do3changes(infilelines, insertlines)
  130.                
  131.                 try:
  132.                         for line in edited:
  133.                                 outfile.write(line)
  134.                         outfile.flush(); outfile.close()
  135.                 except:
  136.                         ioerror('output')
  137.  
  138.  
  139. # God forbid anyone actually import this module, but just in case...
  140. if __name__ == '__main__':
  141.         main()

Submit Fix

Any tags you'd like to associate with your code, delimitered by commas (example: Views, CCK, Module, etc).
Select the syntax highlighting mode to use.