]> git.llucax.com Git - software/sercom-old.git/blob - src/sc_dbq
Nueva opción para ver atributos de un objeto con el comando ls de sc_dbq.
[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 try:
47     pos = obj.index('.')
48     attr = obj[pos+1:]
49     obj = obj[:pos]
50 except:
51     attr = None
52 cmd = sys.argv[2]
53 oid = None
54 args = sys.argv[3:]
55 try:
56     if sys.argv[3].isdigit():
57         oid = int(sys.argv[3])
58         args = sys.argv[4:]
59 except: pass
60
61 # Proceso comandos
62 try:
63     if cmd in ('list', 'ls'):
64         if oid is not None:
65             objs = [eval(obj).get(oid, connection=conn)]
66         elif args:
67             objs = eval(obj).selectBy(**args2dict(args, conn))
68         else:
69             objs = eval(obj).select(connection=conn)
70         for o in objs:
71             if attr is None:
72                 print o
73             else:
74                 print o
75                 print attr + ':'
76                 import pprint
77                 attr = eval('o.' + attr)
78                 pprint.pprint(attr)
79     elif cmd in ('rm', 'remove', 'delete', 'del'):
80         if oid is not None:
81             objs = [eval(obj).get(oid, connection=conn)]
82         else:
83             objs = eval(obj).selectBy(args2dict(args, conn))
84         for o in objs:
85             print 'Borrando:', o
86             o.destroySelf()
87     elif cmd in ('set', 'update'):
88         if oid is not None:
89             objs = [eval(obj).get(oid, connection=conn)]
90         else:
91             where = args[:args.index('--')]
92             args = args[args.index('--')+1:]
93             objs = eval(obj).selectBy(**args2dict(where, conn))
94         for o in objs:
95             print 'Modificando:', o,
96             o.set(**args2dict(args, conn))
97             print '->', o
98     elif cmd in ('add', 'new', 'insert'):
99         o = eval(obj)(**args2dict(args, conn))
100         print 'Agregado:', o
101     else:
102         print >>sys.stderr, 'Comando incorrecto (%s)!' % cmd
103         print >>sys.stderr, ayuda()
104         sys.exit(2)
105 except ValueError:
106     print >>sys.stderr, 'Argumento inválido!'
107     print >>sys.stderr, ayuda()
108     sys.exit(3)
109 except Exception, msg:
110     print >>sys.stderr, 'ERROR:', msg
111     sys.exit(100)
112