]> git.llucax.com Git - software/sercom-old.git/blob - src/sc_dbq
Hack para esquivar un bug de SQLObject.
[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 import locale
9 import ConfigParser
10 # Módulos externos
11 import sqlobject
12 # Módulos locales
13 from sercom.dbo import *
14
15 def ayuda():
16     return '''Uso:
17     %s objeto comando [opciones]''' % sys.argv[0]
18
19 def args2dict(l, conn):
20     d = {'connection': conn}
21     for arg in l:
22         key, val = arg.split('=')
23         if val == 'None': val = None
24         d[key] = val
25     return d
26
27 if len(sys.argv) < 3:
28     print >>sys.stderr, 'Faltan argumentos!'
29     print >>sys.stderr, ayuda()
30     sys.exit(1)
31
32 # Seteo locale
33 locale.setlocale(locale.LC_ALL, '')
34
35 # Obtengo configuración
36 conf = ConfigParser.SafeConfigParser()
37 if not conf.read(('/etc/sercom/sercom.ini', os.path.expanduser('~/.sercom/sercom.ini'), 'sercom.ini')):
38     sys.stderr.write('No se pudo obtener configuración!\n')
39     sys.exit(1)
40
41 # Conexión a la DB
42 conn = sqlobject.connectionForURI(conf.get('dbo', 'database'))
43
44 # Argumentos interesantes
45 obj = sys.argv[1]
46 cmd = sys.argv[2]
47 oid = None
48 args = sys.argv[3:]
49 try:
50     if sys.argv[3].isdigit():
51         oid = int(sys.argv[3])
52         args = sys.argv[4:]
53 except: pass
54
55 # Proceso comandos
56 try:
57     if cmd in ('list', 'ls'):
58         if oid is not None:
59             objs = [eval(obj).get(oid, connection=conn)]
60         elif args:
61             objs = eval(obj).selectBy(**args2dict(args, conn))
62         else:
63             objs = eval(obj).select(connection=conn)
64         for o in objs:
65             print o
66     elif cmd in ('rm', 'remove', 'delete', 'del'):
67         if oid is not None:
68             objs = [eval(obj).get(oid, connection=conn)]
69         else:
70             objs = eval(obj).selectBy(args2dict(args, conn))
71         for o in objs:
72             print 'Borrando:', o
73             o.destroySelf()
74     elif cmd in ('set', 'update'):
75         if oid is not None:
76             objs = [eval(obj).get(oid, connection=conn)]
77         else:
78             where = args[:args.index('--')]
79             args = args[args.index('--')+1:]
80             objs = eval(obj).selectBy(**args2dict(where, conn))
81         for o in objs:
82             print 'Modificando:', o,
83             o.set(**args2dict(args, conn))
84             print '->', o
85     elif cmd in ('add', 'new', 'insert'):
86         o = eval(obj)(**args2dict(args, conn))
87         print 'Agregado:', o
88     else:
89         print >>sys.stderr, 'Comando incorrecto (%s)!' % cmd
90         print >>sys.stderr, ayuda()
91         sys.exit(2)
92 except ValueError:
93     print >>sys.stderr, 'Argumento inválido!'
94     print >>sys.stderr, ayuda()
95     sys.exit(3)
96 except Exception, msg:
97     print >>sys.stderr, 'ERROR:', msg
98     sys.exit(100)
99