Changeset 4521:4d6d811cc30b in livinglogic.python.xist for src/ll/orasql/scripts/oradelete.py

Show
Ignore:
Timestamp:
07/14/11 15:34:21 (8 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Add --keepjunk, --include and --exclude option to oradelete.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/ll/orasql/scripts/oradelete.py

    r4453 r4521  
    4444        tables after ``oradelete -x``. 
    4545 
     46    ``-k``, ``--keepjunk`` : ``false``, ``no``, ``0``, ``true``, ``yes`` or ``1`` 
     47        If true (the default), database objects that have ``$`` or 
     48        ``SYS_EXPORT_SCHEMA_`` in their name will be skipped (otherwise these 
     49        objects will be included in the output). 
     50 
    4651    ``-i``, ``--ignore`` : ``false``, ``no``, ``0``, ``true``, ``yes`` or ``1`` 
    4752        If given, errors occuring while the database is read or written will be 
     
    5459        If given the script uses the ``TRUNCATE`` command instead of the ``DELETE`` 
    5560        command. 
     61 
     62    ``--include`` : regexp 
     63        Only include objects in the output if their name contains the regular 
     64        expression. 
     65 
     66    ``--exclude`` : regexp 
     67        Exclude objects from the output if their name contains the regular 
     68        expression. 
    5669""" 
    5770 
    5871 
    59 import sys, os, argparse 
     72import sys, os, re, argparse 
    6073 
    6174from ll import misc, astyle, orasql 
     
    7891    p.add_argument("-s", "--sequences", dest="sequences", help="Reset sequences? (default %(default)s)", default=False, action=misc.FlagAction) 
    7992    p.add_argument("-x", "--execute", dest="execute", action=misc.FlagAction, help="immediately execute the commands instead of printing them? (default %(default)s)") 
     93    p.add_argument("-k", "--keepjunk", dest="keepjunk", help="Output objects with '$' or 'SYS_EXPORT_SCHEMA_' in their name? (default %(default)s)", default=False, action="store_true") 
    8094    p.add_argument("-i", "--ignore", dest="ignore", help="Ignore errors? (default %(default)s)", default=False, action=misc.FlagAction) 
    8195    p.add_argument("-e", "--encoding", dest="encoding", help="Encoding for output (default %(default)s)", default="utf-8") 
    8296    p.add_argument("-t", "--truncate", dest="truncate", help="Truncate tables (instead of deleting)? (default %(default)s)", default=False, action=misc.FlagAction) 
     97    p.add_argument(      "--include", dest="include", metavar="REGEXP", help="Include only objects whose name contains PATTERN (default: %(default)s)", type=re.compile) 
     98    p.add_argument(      "--exclude", dest="exclude", metavar="REGEXP", help="Exclude objects whose name contains PATTERN (default: %(default)s)", type=re.compile) 
    8399 
    84100    args = p.parse_args(args) 
     
    99115    cs = s4connectstring(connection.connectstring()) 
    100116 
    101     for (i, obj) in enumerate(connection.itertables(schema="user", mode="drop")): 
     117    def keep(obj): 
     118        if ("$" in obj.name or "/" in obj.name or obj.name.startswith("SYS_EXPORT_SCHEMA_")) and not args.keepjunk: 
     119            return False 
     120        if args.include is not None and args.include.search(obj.name) is None: 
     121            return False 
     122        if args.exclude is not None and args.exclude.search(obj.name) is not None: 
     123            return False 
     124        return True 
     125 
     126    for (i, obj) in enumerate(connection.itertables(owner=None, mode="drop")): 
     127        keepobj = keep(obj) 
    102128        # Progress report 
    103129        if args.verbose: 
    104130            msg = "truncating" if args.truncate else "deleting from" 
    105131            msg = astyle.style_default("oradelete.py: ", cs, ": {} #{} ".format(msg, i+1), s4object(str(obj))) 
     132            if not keepobj: 
     133                msg = astyle.style_default(msg, " ", s4warning("(skipped)")) 
    106134            stderr.writeln(msg) 
    107135 
    108         # Print or execute SQL 
    109         if args.execute: 
    110             try: 
    111                 fmt = u"truncate table {}" if args.truncate else u"delete from {}" 
    112                 cursor.execute(fmt.format(obj.name)) 
    113             except orasql.DatabaseError, exc: 
    114                 if not args.ignore or "ORA-01013" in str(exc): 
    115                     raise 
    116                 stderr.writeln("oradelete.py: ", s4error("{}: {}".format(exc.__class__, str(exc).strip()))) 
    117         else: 
    118             if args.truncate: 
    119                 sql = u"truncate table {};\n".format(obj.name) 
    120             else: 
    121                 sql = u"delete from {};\n".format(obj.name) 
    122             stdout.write(sql.encode(args.encoding)) 
    123     if not args.truncate: 
    124         connection.commit() 
    125  
    126     if args.sequences: 
    127         for (i, obj) in enumerate(connection.itersequences(schema="user")): 
    128             # Progress report 
    129             if args.verbose: 
    130                 msg = astyle.style_default("oradelete.py: ", cs, ": recreating #{} ".format(i+1), s4object(str(obj))) 
    131                 stderr.writeln(msg) 
    132  
     136        if keepobj: 
    133137            # Print or execute SQL 
    134138            if args.execute: 
    135139                try: 
    136                     sql = obj.createddl(term=False) 
    137                     cursor.execute(obj.dropddl(term=False)) 
    138                     cursor.execute(sql) 
     140                    fmt = u"truncate table {}" if args.truncate else u"delete from {}" 
     141                    cursor.execute(fmt.format(obj.name)) 
    139142                except orasql.DatabaseError, exc: 
    140143                    if not args.ignore or "ORA-01013" in str(exc): 
     
    142145                    stderr.writeln("oradelete.py: ", s4error("{}: {}".format(exc.__class__, str(exc).strip()))) 
    143146            else: 
    144                 sql = obj.dropddl(term=True) + obj.createddl(term=True) 
     147                if args.truncate: 
     148                    sql = u"truncate table {};\n".format(obj.name) 
     149                else: 
     150                    sql = u"delete from {};\n".format(obj.name) 
    145151                stdout.write(sql.encode(args.encoding)) 
     152    if not args.truncate: 
     153        connection.commit() 
     154 
     155    if args.sequences: 
     156        for (i, obj) in enumerate(connection.itersequences(owner=None)): 
     157            keepobj = keep(obj) 
     158            # Progress report 
     159            if args.verbose: 
     160                msg = astyle.style_default("oradelete.py: ", cs, ": recreating #{} ".format(i+1), s4object(str(obj))) 
     161                if not keepobj: 
     162                    msg = astyle.style_default(msg, " ", s4warning("(skipped)")) 
     163                stderr.writeln(msg) 
     164 
     165            if keepobj: 
     166                # Print or execute SQL 
     167                if args.execute: 
     168                    try: 
     169                        sql = obj.createddl(term=False) 
     170                        cursor.execute(obj.dropddl(term=False)) 
     171                        cursor.execute(sql) 
     172                    except orasql.DatabaseError, exc: 
     173                        if not args.ignore or "ORA-01013" in str(exc): 
     174                            raise 
     175                        stderr.writeln("oradelete.py: ", s4error("{}: {}".format(exc.__class__, str(exc).strip()))) 
     176                else: 
     177                    sql = obj.dropddl(term=True) + obj.createddl(term=True) 
     178                    stdout.write(sql.encode(args.encoding)) 
    146179 
    147180if __name__ == "__main__":