# HG changeset patch # User catherine@Elli.myhome.westell.com # Date 1235650073 18000 # Node ID dc768397071753f69bb194451cc8a945f99ecf8a # Parent 52adb09094b3d6438e86b1f340610cbda4d4b227 beginning wildsql diff -r 52adb09094b3 -r dc7683970717 sqlpython/sqlpyPlus.py --- a/sqlpython/sqlpyPlus.py Wed Feb 25 17:45:35 2009 -0500 +++ b/sqlpython/sqlpyPlus.py Thu Feb 26 07:07:53 2009 -0500 @@ -364,15 +364,14 @@ def __init__(self): sqlpython.sqlpython.__init__(self) self.binds = CaselessDict() - self.settable += 'autobind commit_on_exit maxfetch maxtselctrows timeout heading'.split() + self.settable += 'autobind commit_on_exit maxfetch maxtselctrows timeout heading wildsql'.split() self.settable.sort() # settables must be lowercase self.stdoutBeforeSpool = sys.stdout self.spoolFile = None self.autobind = False self.heading = True - #def default(self, arg): - # sqlpython.sqlpython.default(self, arg) + self.wildsql = True # overrides cmd's parseline def parseline(self, line): @@ -495,7 +494,24 @@ stmt = "SELECT object_name FROM all_objects WHERE object_name LIKE '%s%%'" completions = self.select_scalar_list(stmt % (text)) return completions - + + columnlistPattern = pyparsing.SkipTo(pyparsing.CaselessKeyword('from'))('columns') + + wildSqlColnum = pyparsing.Literal(':') + pyparsing.Keyword(pyparsing.nums)('colnum') + wildSqlNot = pyparsing.Literal('!') + pyparsing.Keyword(legalOracle)('col') + wildSqlNotColnum = pyparsing.Literal('!:') + pyparsing.Keyword(legalOracle)('colnum') + for patt in (columnlistPattern, wildSqlColnum, wildSqlNot, wildSqlNotColnum): + patt.ignore(pyparsing.cStyleComment).ignore(Parser.comment_def). \ + ignore(pyparsing.sglQuotedString).ignore(pyparsing.dblQuotedString) + def expandWildSql(self, arg): + try: + columnlist = self.columnlistPattern.parseString(arg).columns + except pyparsing.ParseException: + return arg + while colnum in self.wildSqlNotColnum.scanString(columnlist): + pass + return arg + rowlimitPattern = pyparsing.Word(pyparsing.nums)('rowlimit') terminators = '; \\C \\t \\i \\p \\l \\L \\b '.split() + output_templates.keys() @@ -516,6 +532,8 @@ rowlimit = 0 print "Specify desired number of rows after terminator (not '%s')" % arg.parsed.suffix self.varsUsed = findBinds(arg, self.binds, bindVarsIn) + if self.wildsql: + arg = self.expandWildSql(arg) self.curs.execute('select ' + arg, self.varsUsed) self.rows = self.curs.fetchmany(min(self.maxfetch, (rowlimit or self.maxfetch))) self.rc = self.curs.rowcount