]> git.llucax.com Git - software/sercom-old.git/blob - src/sc_dbq
Se hace que un archivo vacío siga dando error pero un error más descriptivo.
[software/sercom-old.git] / src / sc_dbq
1 #!/usr/bin/env python2.4
2 # -*- encoding: iso-8859-1 -*-
3 # vim: set et sw=4 sts=4 :
4
5 # Módulos estándar
6 import os
7 import sys
8 # Módulos externos
9 import sqlobject
10 # Módulos locales
11 import sercom
12 from sercom.sqlo import *
13
14 def ayuda():
15     return '''Uso:
16     %s objeto comando [opciones]''' % sys.argv[0]
17
18 def args2dict(l, conn):
19     d = {'connection': conn}
20     for arg in l:
21         key, val = arg.split('=')
22         if val == 'None': val = None
23         elif val == 'True': val = True
24         elif val == 'False': val = False
25         elif val.isdigit():
26             val = int(val)
27         else:
28             try:
29                 val = float(val)
30             except ValueError: pass
31         d[key] = val
32     return d
33
34 # Inicializo
35 conf, conn, log = sercom.init('dbq')
36
37 if len(sys.argv) < 3:
38     log.error('Faltan argumentos!')
39     log.error(ayuda())
40     sys.exit(1)
41
42 # Argumentos interesantes
43 obj = sys.argv[1]
44 try:
45     pos = obj.index('.')
46     attr = obj[pos+1:]
47     obj = obj[:pos]
48 except:
49     attr = None
50 cmd = sys.argv[2]
51 oid = None
52 args = sys.argv[3:]
53 try:
54     if sys.argv[3].isdigit():
55         oid = int(sys.argv[3])
56         args = sys.argv[4:]
57 except: pass
58
59 # Proceso comandos
60 try:
61     if cmd in ('list', 'ls'):
62         if oid is not None:
63             objs = [eval(obj).get(oid, connection=conn)]
64         elif args:
65             objs = eval(obj).selectBy(**args2dict(args, conn))
66         else:
67             objs = eval(obj).select(connection=conn)
68         for o in objs:
69             if attr is None:
70                 print o
71             else:
72                 print o
73                 print attr + ':'
74                 import pprint
75                 attr = eval('o.' + attr)
76                 pprint.pprint(attr)
77     elif cmd in ('rm', 'remove', 'delete', 'del'):
78         if oid is not None:
79             objs = [eval(obj).get(oid, connection=conn)]
80         else:
81             objs = eval(obj).selectBy(args2dict(args, conn))
82         for o in objs:
83             print 'Borrando:', o
84             o.destroySelf()
85     elif cmd in ('set', 'update'):
86         if oid is not None:
87             objs = [eval(obj).get(oid, connection=conn)]
88         else:
89             where = args[:args.index('--')]
90             args = args[args.index('--')+1:]
91             objs = eval(obj).selectBy(**args2dict(where, conn))
92         for o in objs:
93             print 'Modificando:', o,
94             o.set(**args2dict(args, conn))
95             print '->', o
96     elif cmd in ('add', 'new', 'insert'):
97         o = eval(obj)(**args2dict(args, conn))
98         print 'Agregado:', o
99     else:
100         log.error('Comando incorrecto (%s)!', cmd)
101         log.error(ayuda())
102         sys.exit(2)
103 except ValueError:
104     log.error('Argumento inválido!')
105     log.error(ayuda())
106     sys.exit(3)
107 except Exception, msg:
108     log.exception(msg)
109     sys.exit(100)
110