lunes, 25 de febrero de 2013

ODBC para DB2 en Ubuntu

Estos son los pasos para instalar y configurar odbc para linux hacia una maquina con iSeries DB2

#install odbc
sudo apt-get install unixodbc

#install iSeries driver
# Download driver from http://www-03.ibm.com/systems/i/software/access/linux/downloads.html

sudo apt-get update
sudo apt-get install alien
cd Downloads/
sudo alien -k iSeriesAccess-7.1.0-1.0.i386.rpm
sudo dpkg -i iseriesaccess_7.1.0-1.0_i386.deb
sudo cp /opt/ibm/iSeriesAccess/lib/* /usr/lib

#config odbc
sudo apt-get install php5-odbc
sudo odbcinst -i -d -f /opt/ibm/iSeriesAccess/unixodbcregistration
sudo ODBCConfig
Leer artículo completo!

Symfony2 Db2 Hack

Ok, ya tengo algo funcionando, el acceso básico a base de datos esta funcionando (create/drop table, create/drop column, alter column, insert, update, delete).

Se creo un nuevo driver, schema y platform todos archivos nuevos basados en los construidos para pdo_ibm. El único archivo cambiado es DriverManager.php para poder registrar el nuevo driver.

Este driver se conecta a DB2 iSeries usando  odbc. Si aun no se tiene acceso por odbc debe instalarse el driver para linux (http://www-03.ibm.com/systems/i/software/access/linux/downloads.html) ver instrucciones aqui, y unixOdbc en un Ubuntu server, luego crear DSN que apunta al servidor DB2, el nombre del  DNS debe ser el mismo que el nombre de la base de datos a la cual se conecta.

El nuevo driver se llama "pdo_ibm_i", el parámetro database_host no se usa, este debe definirse en el DSN de odbc .

Los archivos están en vendor.zip.



Leer artículo completo!

martes, 19 de febrero de 2013

LastinsertId no soportado por pdo odbc?

Al parecer PDOOdbc no implementa lastinsertid, aunque la documentacion oficial dice que si.

Lo que hice fue implementar la busqueda usando sql para db2 y cree una nueva clase PDOIbmConnection que hereda de PDOConnection y sobreescribí el método lastInsertId.

    public function lastInsertId($name = null) {
        $stm = parent::prepare("SELECT IDENTITY_VAL_LOCAL() AS VAL FROM SYSIBM.SYSDUMMY1");
        $stm->execute();
        $result = $stm->fetch(parent::FETCH_ASSOC);
        return $result['VAL'];
    }



Leer artículo completo!

miércoles, 13 de febrero de 2013

Alter table no puede colocar not null

Cuando se hace un alter table ya sea para agregar una columna no se puede agregar not null, puede ser debido a que la tabla puede tener datos y se agrega una columna not null y no tiene valor por defecto con que valor lo va a llenar el motor de base de datos?

Lamentablemente parece que Doctrine no permite definir valores por defecto por lo tanto tendremos que ajustar el DB2Platform para que no incluya en la sentencia el not null.

Esto tiene un efecto secundario:
Si agregamos una columna que deba ser no nula a una tabla que ya exista, este parámetro nunca llegara a la base de datos (a menos que borremos la tabla), la comparación del modelo y la base de datos siempre informará que debe alterar la columna para agregar el not null.
Leer artículo completo!

Db2 Drop column en odbc resulta en operacion cancelada

Acabo de encontrar que no es posible borrar una columna en db2 por odbc, esta operación en el 400 demanda una confirmación, la columna se puede borrar por pantalla verde o por iSeriesNavegator luego de darle ignorar al mensaje. Pero en odbc es imposible (Hasta donde he encontrado) responder al mensaje de confirmación que dice que puede haber perdida de datos.

La respuesta del error no dice mucho solo
SQLSTATE[HY008]: Operation canceled: 30071 [IBM][Controlador ODBC de System i Access]Operación cancelada.
La única opción que he encontrado es configurar la base de datos para que no solicite la confirmación de borrado de la columna mediante el comando de pantalla verde :

CHGMSGD MSGID(CPA32B2) MSGF(QSYS/QCPFMSG) DFT('I')
 Este cambio aplica para todas las bases de datos y usuarios de la maquina iSeries donde se ejecute. Esto puede ser valido para un entorno de desarrollo, aqui podremos dejar que symfony cambie el modelo todo lo que quiera, pero en los servidores de producción no podemos hacer los mismo, lo mas seguro es que el dba ejecute las instrucciones SQL una por una en el entorno de producción caso de ser necesario algún cambio.
Leer artículo completo!