# HG changeset patch # User devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil # Date 1198078081 18000 # Node ID 2776755a3a7e1a0d4bef8b8abeb5c2d6bda418b5 # Parent 9c7df9f825a1081441d2865704de3223c3491f2b beginning separation of cmd2 diff -r 9c7df9f825a1 -r 2776755a3a7e cmd2.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmd2.py Wed Dec 19 10:28:01 2007 -0500 @@ -0,0 +1,97 @@ +import cmd, re + +class HistoryItem(str): + def __init__(self, instr): + str.__init__(self, instr) + self.lowercase = self.lower() + self.idx = None + def pr(self): + print '-------------------------[%d]' % (self.idx) + print self + +class History(list): + rangeFrom = re.compile(r'^([\d])+\s*\-$') + def append(self, new): + new = HistoryItem(new) + list.append(self, new) + new.idx = len(self) + def extend(self, new): + for n in new: + self.append(n) + def get(self, getme): + try: + getme = int(getme) + if getme < 0: + return self[:(-1 * getme)] + else: + return [self[getme-1]] + except IndexError: + return [] + except (ValueError, TypeError): + getme = getme.strip() + mtch = self.rangeFrom.search(getme) + if mtch: + return self[(int(mtch.group(1))-1):] + if getme.startswith(r'/') and getme.endswith(r'/'): + finder = re.compile(getme[1:-1], re.DOTALL | re.MULTILINE | re.IGNORECASE) + def isin(hi): + return finder.search(hi) + else: + def isin(hi): + return (getme.lower() in hi.lowercase) + return [itm for itm in self if isin(itm)] + +class Cmd(cmd.Cmd): + def __init__(self, *args, **kwargs): + cmd.Cmd.__init__(self, *args, **kwargs) + self.history = History() + self.excludeFromHistory = '''run r list l history hi ed li'''.split() + + def postcmd(self, stop, line): + """Hook method executed just after a command dispatch is finished.""" + try: + command = line.split(None,1)[0].lower() + if command not in self.excludeFromHistory: + self.history.append(line) + finally: + return stop + + def do_history(self, arg): + """history [arg]: lists past commands issued + + no arg -> list all + arg is integer -> list one history item, by index + arg is string -> string search + arg is /enclosed in forward-slashes/ -> regular expression search + """ + if arg: + history = self.history.get(arg) + else: + history = self.history + for hi in history: + hi.pr() + def last_matching(self, arg): + try: + if arg: + return self.history.get(arg)[-1] + else: + return self.history[-1] + except: + return None + def do_list(self, arg): + """list [arg]: lists last command issued + + no arg -> list absolute last + arg is integer -> list one history item, by index + - arg, arg - (integer) -> list up to or after #arg + arg is string -> list last command matching string search + arg is /enclosed in forward-slashes/ -> regular expression search + """ + try: + self.last_matching(arg).pr() + except: + pass + do_hi = do_history + do_l = do_list + do_li = do_list + diff -r 9c7df9f825a1 -r 2776755a3a7e sqlpyPlus.py --- a/sqlpyPlus.py Tue Dec 18 19:18:22 2007 -0500 +++ b/sqlpyPlus.py Wed Dec 19 10:28:01 2007 -0500 @@ -340,54 +340,12 @@ if not givenBindVars.has_key(varname): print 'Bind variable %s not defined.' % (varname) return result - -class HistoryItem(str): - def __init__(self, instr): - str.__init__(self, instr) - self.lowercase = self.lower() - self.idx = None - def pr(self): - print '-------------------------[%d]' % (self.idx) - print self - -class History(list): - rangeFrom = re.compile(r'^([\d])+\s*\-$') - def append(self, new): - new = HistoryItem(new) - list.append(self, new) - new.idx = len(self) - def extend(self, new): - for n in new: - self.append(n) - def get(self, getme): - try: - getme = int(getme) - if getme < 0: - return self[:(-1 * getme)] - else: - return [self[getme-1]] - except IndexError: - return [] - except (ValueError, TypeError): - getme = getme.strip() - mtch = self.rangeFrom.search(getme) - if mtch: - return self[(int(mtch.group(1))-1):] - if getme.startswith(r'/') and getme.endswith(r'/'): - finder = re.compile(getme[1:-1], re.DOTALL | re.MULTILINE | re.IGNORECASE) - def isin(hi): - return finder.search(hi) - else: - def isin(hi): - return (getme.lower() in hi.lowercase) - return [itm for itm in self if isin(itm)] class sqlpyPlus(sqlpython.sqlpython): def __init__(self): sqlpython.sqlpython.__init__(self) self.binds = CaselessDict() self.sqlBuffer = [] - self.history = History() self.settable = ['maxtselctrows', 'maxfetch', 'autobind', 'failover', 'timeout'] # settables must be lowercase self.stdoutBeforeSpool = sys.stdout self.spoolFile = None @@ -395,7 +353,6 @@ self.failover = False self.multiline = '''select insert update delete tselect create drop alter'''.split() - self.excludeFromHistory = '''run r list l history hi ed li'''.split() def default(self, arg, do_everywhere=False): sqlpython.sqlpython.default(self, arg, do_everywhere) @@ -458,15 +415,6 @@ except Exception: return line - def postcmd(self, stop, line): - """Hook method executed just after a command dispatch is finished.""" - try: - command = line.split(None,1)[0].lower() - if command not in self.excludeFromHistory: - self.history.append(line) - finally: - return stop - def onecmd_plus_hooks(self, line): line = self.precmd(line) stop = self.onecmd(line) @@ -813,44 +761,7 @@ print runme self.onecmd_plus_hooks(runme) do_r = do_run - def do_history(self, arg): - """history [arg]: lists past commands issued - - no arg -> list all - arg is integer -> list one history item, by index - arg is string -> string search - arg is /enclosed in forward-slashes/ -> regular expression search - """ - if arg: - history = self.history.get(arg) - else: - history = self.history - for hi in history: - hi.pr() - def last_matching(self, arg): - try: - if arg: - return self.history.get(arg)[-1] - else: - return self.history[-1] - except: - return None - def do_list(self, arg): - """list [arg]: lists last command issued - - no arg -> list absolute last - arg is integer -> list one history item, by index - - arg, arg - (integer) -> list up to or after #arg - arg is string -> list last command matching string search - arg is /enclosed in forward-slashes/ -> regular expression search - """ - try: - self.last_matching(arg).pr() - except: - pass - do_hi = do_history - do_l = do_list - do_li = do_list + def load(self, fname): """Pulls command(s) into sql buffer. Returns number of commands loaded.""" try: diff -r 9c7df9f825a1 -r 2776755a3a7e sqlpython.py --- a/sqlpython.py Tue Dec 18 19:18:22 2007 -0500 +++ b/sqlpython.py Wed Dec 19 10:28:01 2007 -0500 @@ -8,18 +8,18 @@ # Best used with the companion modules sqlpyPlus and mysqlpy # See also http://twiki.cern.ch/twiki/bin/view/PSSGroup/SqlPython -import cmd,getpass,binascii,cx_Oracle,re +import cmd2,getpass,binascii,cx_Oracle,re import pexpecter # complication! separate sessions -> # separate transactions !!!!! # also: timeouts, other session failures -class sqlpython(cmd.Cmd): +class sqlpython(cmd2.Cmd): '''A python module to reproduce Oracle's command line with focus on customization and extention''' def __init__(self): - cmd.Cmd.__init__(self) + cmd2.Cmd.__init__(self) self.prompt = 'SQL.No_Connection> ' self.maxfetch = 1000 self.failoverSessions = []