def get_table_columns(conn,obj): """ Obtiene las columnas de una tabla """ cur = conn.cursor() cur.execute(""" SELECT a.attname, pg_catalog.format_type(a.atttypid, a.atttypmod), (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) FROM pg_catalog.pg_attrdef d WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) as format_extra, a.attnotnull, a.attnum FROM pg_catalog.pg_attribute a WHERE a.attrelid = %s AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum """, [obj.oid]) for name, format_type, format_extra, notnull, number in cur: field = Struct() field.name = name field.format_type = format_type field.format_extra = format_extra field.default = None # <- probablemente esta en format_extra... field.notnull = notnull field.nullable = not field.notnull field.sql_nullable = "NOT NULL" if notnull else "" field.number = number yield field
def getTableObj(tree,root): table = Struct() table.xmltree = tree table.xmlroot = root table.name = table.xmlroot.xpath("name/text()")[0] table.fields = [] table.pk = [] table.fields_idx = {} for xmlfield in table.xmlroot.xpath("field"): field = Struct() field.name = xmlfield.xpath("name/text()")[0] build_field_type(field, xmlfield) field.pk = text2bool(one(xmlfield.xpath("pk/text()"),"false")) field.default = one(xmlfield.xpath("default/text()"),None) if field.pk: table.pk.append(field.name) if field.name in table.fields_idx: raise ValueError("La tabla %s tiene el campo %s repetido" % (table.name,field.name)) field.number = len(table.fields) table.fields_idx[field.name] = field.number table.fields.append(field) return table
def get_oids(conn): cur = conn.cursor() cur.execute(""" SELECT c.oid, n.nspname, c.relname FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname != 'pg_catalog' AND pg_catalog.pg_table_is_visible(c.oid) ORDER BY 2, 3; """) for oid, namespace, relname in cur: obj = Struct() obj.oid = oid obj.namespace = namespace obj.name = relname yield obj
def get_table_parents(conn,obj): """ Obtiene las tablas padres de una tabla (tablas de las que hereda una tabla) """ cur.execute(""" SELECT c.oid::pg_catalog.regclass, c.relname, n.nspname FROM pg_catalog.pg_class c INNER JOIN pg_catalog.pg_inherits i ON c.oid=i.inhparent LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE i.inhrelid = %s ORDER BY inhseqno """, [obj.oid]) for oid, relname, namespace in cur: obj = Struct() obj.oid = oid obj.namespace = namespace obj.name = relname yield obj
def get_relname_oid(conn, relname): """ Obtiene el OID de una relación (tabla, indice, pkey, etc) """ cur = conn.cursor() cur.execute(""" SELECT c.oid, n.nspname, c.relname FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = %s AND pg_catalog.pg_table_is_visible(c.oid) ORDER BY 2, 3; """, [relname]) for oid, namespace, relname in cur: obj = Struct() obj.oid = oid obj.namespace = namespace obj.name = relname return obj
def get_table_indexes(conn,obj): """ Obtiene los indices de una tabla """ cur = conn.cursor() cur.execute(""" SELECT c2.oid, c2.relname, i.indisprimary, i.indisunique, i.indisclustered, i.indisvalid, pg_catalog.pg_get_indexdef(i.indexrelid, 0, true), c2.reltablespace FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i WHERE c.oid = %s AND c.oid = i.indrelid AND i.indexrelid = c2.oid ORDER BY i.indisprimary DESC, i.indisunique DESC, c2.relname """, [obj.oid]) for oid, name, isprimary, isunique, isclustered, isvalid, sql_definition, tablespace_oid in cur: index = Struct() index.oid = oid index.name = name index.isprimary = isprimary index.isunique = isunique index.isclustered = isclustered index.isvalid = isvalid index.sql_definition = sql_definition index.tablespace_oid = tablespace_oid index.columns = get_index_columns(conn, index) yield index
def btnIniciar_clicked(self, checked=None): self.n = 0 def status(x): self.status.setText(x); QtGui.QApplication.processEvents() def count_step(n=1): self.n = (self.n + n) % 99 + 1; self.progress.setValue(self.n); QtGui.QApplication.processEvents() def end_step(): self.n = 100; self.progress.setValue(self.n); QtGui.QApplication.processEvents() status(u"Analizando la carpeta del proyecto . . . ") count_step() app_folder = str(self.dbProyecto.value()) conn = self.parent.conn cur = self.parent.cur sysprefix = str(settings.value(KEY_SYSTEM_TABLE_PREFIX).toString()) if not os.path.exists(app_folder): raise ValueError(u"La carpeta especificada no existe") if not os.path.isdir(app_folder): raise ValueError(u"La carpeta especificada no es una carpeta") folders = [ x for x in os.listdir(app_folder) if os.path.isdir(os.path.join(app_folder,x)) ] file_upload_list = {} for fname in folders: ftype = KNOWN_FOLDERS.get(fname,None) if ftype is None: continue # ignorar las carpetas que no conocemos for filename in os.listdir(os.path.join(app_folder,fname)): file_obj = Struct() file_obj.name = filename file_obj.ftype = ftype file_obj.path = os.path.join(app_folder,fname,filename) file_upload_list[filename] = file_obj if len(file_upload_list) == 0: raise ValueError(u"No hay ningún fichero de proyecto aquí.") status(u"Obteniendo la lista de versiones subidas actualmente . . . ") count_step() max_version = 1 # AlephERP tiene un bug con la version 1, asi que la primera sera la version 2 cur.execute(""" SELECT nombre, version FROM %s_system """ % sysprefix) uploaded_files = {} for (nombre, version) in cur: if version > max_version: max_version = version uploaded_files[nombre] = version next_version = max_version + 1 status(u"Borrando ficheros anteriores . . . ") stepsz = 20/(len(uploaded_files)+1) for filename in uploaded_files.keys(): cur.execute(""" DELETE FROM %s_system WHERE nombre = %%s """ % sysprefix, [filename]) count_step(stepsz) status(u"Subiendo ficheros . . . ") stepsz = 60/(len(file_upload_list)) for filename, obj in file_upload_list.items(): cur.execute(""" INSERT INTO %s_system (nombre,contenido,type,version) VALUES ( %%s, %%s, %%s, %%s ) """ % sysprefix, [filename, open(obj.path).read(), obj.ftype, next_version]) count_step(stepsz) status(u"Proceso completado. El proyecto ha sido cargado con versión %d." % next_version) end_step() self.completed = True self.emit(QtCore.SIGNAL("completeChanged()"))