Como crear hashtables con javascript

A veces en javascript se extrañan los contenedores tipo hashtables :) esto puede emularlos 😀

function hashtable(id,val){
this.id = id;
this.val = val;
}

Esto nos permite crear objetos contenedores de info

var foo = new hashtable(1,'datos');

Cute no?

Crear una Clase Conexión para conectarse a “Cualquier Base de datos” usando OOP

Veo que muchos aquí tratan de empezar a hacer sus “Clases de conexión” no obstante que les parece si hacemos un ejemplo un poco más OOP y mas robusto.

Misión: Crear una conexión con “cualquier base de datos” solo creando los adaptadores necesarios haciendo uso de interfaces.

DbInterface.php


Db.php

db = $db;
    }
    public function conectar()
    {
        $this->db->conectar();
    }
    public function desconectar()
    {
        $this->db->desconectar();
    }
    public function ejecutar(SQL $sql)
    {
        return $this->db->ejecutar($sql);
    }
}

SQL.php


campos[] = $campo;
    }
    public function addTabla($tabla)
    {
        $this->tablas[] = $tabla;
    }
    public function addWhere($where)
    {
        $this->wheres[] = $where;
    }
    public function addOrder($or)
    {
        $this->orders[] = $or;
    }
    private function make()
    {
        $this->consulta = 'SELECT ';
        foreach($this->campos as $campo){
            $cadenaCampos.= ' '.$campo.', ';
        }
        $this->consulta.= substr($cadenaCampos,0,strlen($cadenaCampos)-2);
        $this->consulta.= ' FROM ';
        foreach($this->tablas as $tabla){
            $cadenaTablas.= ' '.$tabla.', ';
        }
        $this->consulta.= substr($cadenaTablas,0,strlen($cadenaTablas)-2);
        if(count($this->wheres)!=0){
            $this->consulta.= ' WHERE ';
            foreach($this->wheres as $where){
                $cadenaWheres.= ''.$where.' AND ';
            }
            $this->consulta.= substr($cadenaWheres,0,strlen($cadenaWheres)-4);
        }
        if(count($this->orders)!=0){
            $this->consulta.= ' ORDER BY ';
            foreach($this->orders as $order){
                $cadenaOrders.= ''.$order.', ';
            }
            $this->consulta.= substr($cadenaOrders,0,strlen($cadenaOrders)-2);
        }
        return $this->consulta;
    }
    public function get()
    {
        return $this->make();
    }
    public function toString()
    {
        return $this->make();
    }
}

Ahora es necesario crear un "Adaptador" para la base de datos que necesitemos, en este caso hare un adaptador para MYSQL que use la interfaz DbInterface, en el caso de querer trabajar por ejemplo con Oracle o Postgress o SQLLite, SQL server etc etc, necesitaremos crear un adaptador para cada caso en particular.

Mysql.php


host = $args[0];
        $this->user = $args[1];
        $this->pass = $args[2];
        $this->db = $args[3];
    }
    public function conectar()
    {
        mysql_connect($this->host,$this->user,$this->pass);
        mysql_select_db($this->db);
    }
    public function desconectar()
    {
        mysql_close();
    }
    public function ejecutar(SQL $sql)
    {
        $consulta = mysql_query($sql->get());
        while($row = mysql_fetch_assoc($consulta)){
            $datos[] = $row;
        }
        return $datos;
    }
}

y Ahora como usamos esto?

index.php


conectar();
        $consulta = new SQL();
        $consulta->addTabla('clientes');
            $consulta->addCampo('razon');
            $consulta->addCampo('nombre');
            $consulta->addCampo('apellidos');
        //$consulta->addWhere("nombre = 'Pepito'");
        $consulta->addOrder("razon DESC");
        $datos = $db->ejecutar($consulta);
        foreach($datos as $val){
            echo $val['nombre']." ".$val['apellidos']."
";
        }
?>

Si observamos la siguiente linea

 $db = new Db(new MySql('localhost','root','','password'));

Nosotros podríamos pasarle cualquier otro adaptador por ejemplo..

 
$db = new Db(new Oracle('localhost','root','','password'));
$db = new Db(new SQLServer('localhost','root','','password'));

Y no seria necesario tocar ninguna otra parte del código :)