Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
    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()"))