# -*- coding: latin-1 -*-
"""
Clases genéricas relativas a las bases de datos.
"""

import sqlite3 as sqlite
import DBF

class DBBase :
    """
    Hace referencia a una base de datos.
    Establece la conexion y permite cerrarla.
    """
    def __init__( self, nomFichero ) :
        self.nomFichero = nomFichero
        self.conexion = sqlite.connect( nomFichero )
        self.conexion.text_factory = lambda x: unicode(x, "latin-1", "ignore")

    def cerrar( self ) :
        """
        Cierra la copnexión a esta base de datos
        """
        self.conexion.close()

    def dbf( self, ctabla, select, condicion = "", orden = "" ):
        """
        Acceso a una tabla con un navegador tipo DBF, con lectura inicial de los RowIDs

        @param ctabla: nombre de la tabla
        @param select: lista de campos separados por comas
        @param condicion: sentencia de condición SQL
        @param orden: sentencia de orden SQL
        """
        return DBF.DBF( self.conexion, ctabla, select, condicion, orden )

    def dbfT( self, ctabla, select, condicion = "", orden = "" ):
        """
        Acceso a una tabla con un navegador tipo DBF, con lectura completa de todos los datos.

        @param ctabla: nombre de la tabla
        @param select: lista de campos separados por comas
        @param condicion: sentencia de condición SQL
        @param orden: sentencia de orden SQL
        """
        return DBF.DBFT( self.conexion, ctabla, select, condicion, orden )

class TablaBase :
    """
    Definición genérica de una tabla.
    """
    def __init__( self ) :
        self.liCampos = []
        self.liIndices = []
        self.nombre = ""

    def crearBase( self, cursor ) :
        sql = "CREATE TABLE %s ("%self.nombre
        for x in self.liCampos :
            sql += x.create().rstrip() + ","
        sql = sql[:-1] + " );"
        cursor.execute( sql )

        for x in self.liIndices :
            c = "UNIQUE" if x.siUnico else ""
            cursor.execute( "CREATE %s INDEX [%s] ON '%s'(%s);"%( c, x.nombre, self.nombre, x.campos ) )

class Campo :
    """
    Definición genérica de un campo de una tabla.
    """
    def __init__( self, nombre, tipo, notNull=False, primaryKey = False, autoInc = False ) :
        self.nombre = nombre
        self.tipo = tipo
        self.notNull = notNull
        self.primaryKey = primaryKey
        self.autoInc = autoInc

    def create( self ) :
        c = ""
        if self.notNull :
            c += "NOT NULL"
        if self.primaryKey :
            c += " PRIMARY KEY"
        if self.autoInc :
            c += " AUTOINCREMENT"
        return "%s %s %s"%( self.nombre, self.tipo, c )

class Indice :
    """
    Definición genérica de un índice de una tabla.
    """
    def __init__( self, nombre, campos, siUnico = False ) :
        self.nombre = nombre
        self.campos = campos
        self.siUnico = siUnico
