sábado, 28 de julio de 2007

Importar datos externos a nuestra base de datos PostgreSQL mediante un script PHP

Hola a todos, este documento bien podria ser la continuación del documento anterior "Importar datos externos a nuestra base de datos PostgreSQL mediante COPY" pero ahora nos toca usar PHP para la importación de datos CSV hacia nuestra querida base de datos PostgreSQL.

Primero que nada empezemos por definir nuestra tabla que contendra los datos. La tabla tiene las siguientes caracteristicas para el ejemplo en cuestion:

Tabla «public.clientes_csv»
Columna | Tipo | Modificadores
---------------------+------------------------+---------------
id | integer |
rfc | character varying(15) |
nombre_razon_social | character varying(80) |
direccion | character varying(120) |
telefonos | character varying(50) |

sicodelico=>


Y ahora pasamos a mostrar un fragmento del archivo de excel con los datos a importar.



Guardamos el archivo para excel en formato CSV, quedandonos un archivo de texto plano en formato ascii y separado por comas. Es vital recordar que debemos eliminar los encabezados o datos que no deseemos importar a nuestra base de datos.

El archivo quedaria de la siguiente forma:


289,"ROAB","ABIGAIL ROCHA","MIRAMONTES","4554-4455"
311,"AHE821025DLA","ABUD HERMANOS S.A DE C.V.","SANTO DEGOLLADO 895 TEQISQUIAPAN SAN LUIS POTOSI","6766-7788"
26,"MBA831017P83","ACABADOS CONTEMPORANEOS","AV.DIVICION DEL NORTE #2001 COLONIA SANTA CRUZ ATOYAC DELEGACION BENITO JUAREZ","5677-5644"
50,"ASH020827694","ACABADOS SHUMA S.A DE C.V","25 PONIENTE 3513 BELICIARIO DOMINGEZ PUEBLA PUEBLA","2345-1033"
38,"AUHY760723CJA","AGUILERA HERNANDEZ YANET","AV.ERMITA IZTAPALAPA #655 PROGRESO DEL SUR IZTAPALAPA MEX.DF","1234-4567"
354,"MAROAA","ALAN AXEL MARIN ROBLES","VENDEDOR DE DELTA","3458-4564"
326,"ABC051019AX6","ALBERCAS BOMBAS Y CALENTADORES S.A DE C.V.","TANKAH MZA 11 LOTE 16 SMZA 27 POR AV. BENITO JUAREZ CANCUN Q.ROO","1234-5676"
41,"BOMA720502825","ALEJANDRA BOLAÑOS MORALES","LIBERTAD #58 LOCAL 4 Y 5 SAN SIMON TICUMAC DEL. BENITO JUAREZ","9890-5678"
207,"ERETQL","ALEJANDRA TERESA HERNANDEZ","CHALCO # 26 COLONIA EL CONDE NAUCALPAN EDO DE MEXICO","1234-5643"
212,"ONAL","ALEJANDRO GONZALEZ","VENTA DE CALENTADOR CON DESCUENTO","4532-2332"
344,"COCA601222LKG","ALEJANDRO SALVADOR COLINAS COSIO","TUXTLA GUTIERREZ CHIAPAS","2332-4554"


El archivo tiene el nombre de clientes.csv, ahora procedamos a mostrar el codigo PHP que nos servira para importarlo a nuestra base de datos mediante un formulario.


<?php
//
// Hecho Por: Julio Cesar Sánchez González - juliocesar_dark@hotmail.com
// Fecha: 27 / Jul / 2007.
//
// El programa se distribuye como tal, sin garantías de ningun tipo y
// esta liberado bajo la licencia publica general de GNU (GPL).
//
?>

<html>
<head>
<title>Importación de un archivo CSV de excel hacia
PostgreSQL</title>
</head>
<table>
<form action="" method="POST" enctype="multipart/form-data">
<tr>
<td>Subir archivo CSV:</td>
<td><input type="file" name="archivo_csv"
id='archivo'></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="E N V I A R">
<input type="reset" value="C A N C E L A R">
</td>
</tr>
</form>
</table>
</body>
</html>

<?php

$file_upload = $_FILES["archivo_csv"]["name"];
$tmp_name = $_FILES["archivo_csv"]["tmp_name"];
$size = $_FILES["archivo_csv"]["size"];
$tipo = $_FILES["archivo_csv"]["type"];

if($size > 0){
echo "<h3>Archivo origen: $file_upload</h3>";
echo "<h3>Archivo destino: $tmp_name</h3>";
echo "<h3>Tamaño del archivo: ".($size/1024)." Kb.</h3>";
echo "<h3>Tipo MIME: $tipo</h3>";

// Comprobamos si el archivo a subir es CSV
if($tipo == "text/csv"){
$conex = "host=localhost port=5432 dbname=sicodelico \
user=juliocs password='foobar'";
$CONN = pg_connect($conex) or die ("Error en el socket \
de conexión");

echo "Conectando con la base de datos...<br>";
echo "Insertando los datos recuperados del archivo \
en la base de datos...<br>";

$fp = fopen($tmp_name, "r");

// Procesamos linea a linea el archivo CSV y
// lo insertamos en la base de datos
while($datos = fgetcsv ($fp, 1000, ",")){
$query = "INSERT INTO clientes_csv (id, rfc, \
nombre_razon_social, direccion, \
telefonos) VALUES ('$datos[0]', '$datos[1]', \
'$datos[2]', '$datos[3]', '$datos[4]')";

//echo $query;

pg_query($CONN, $query);
}

pg_close($CONN);
}else{
echo "<h3>El formato para el archivo especificado \
no es válido.</h3>";
}
}
?>


Aqui tenemos una imagen del formulario en funcionamiento:



y esta seria la salida de un select en el monitor psql de postgres con los datos ya importados:



Creo que eso es todo por hoy, ademas que ya son las 2:18 de la mañana y aunque suelo trabajar de noche mañana tengo una cita de negocios. Una ultima cosa, el codigo PHP lo tuve que cortar con "\" diagonal invertida ya que no se apreciaba bien del todo por el ancho del blog :( .

Buenas noches a todos y hasta la proxima.

jueves, 26 de julio de 2007

Compilar programas en "C" para acceso a datos PostgreSQL

Para compilar un programa escrito en C que emplee la libreria libpq de PostgreSQL es necesario tener instalado los archivos de desarrollo includes para C.

En el siguiente caso probado en Fedora Core 4 funcionaba instalado desde las fuentes.

gcc testpq.c -I/usr/local/pgsql/include -L/usr/local/pgsql/lib -lpq -o testpq

Pero para ubuntu instalado mediante apt-get quedaria de la siguiente forma:

gcc libpqe.c -o libpqe -I/usr/include/postgresql/ -L/usr/include/postgresql -lpq

A continuacion pongo un pequeño programa en C que accesa a una base de datos postgresql y sirve como ejemplo para probar la compilacion de codigo C con las librerias libpq:


/*
/ Programa : sqlt.c
/ Autor : Julio Cesar Sánchez González (juliocesar_dark@hotmail.com) GNU GPL.
/ Fecha : 25 - Mayo - 2006.
/ Ultimo Update: 25 - Mayo - 2006.
/ Revisión : 2
/ Descripción : Obtiene un conjunto resultado de una base de datos postgres proporcionandole la consulta y la base.
*/

#include
#include
#include "libpq-fe.h"
#include

void exit_nicely(PGconn *);

int main(int argc, char *argv[]){

if(argc != 5){
perror ("Sintaxix: sqlt <\"query\">\n");
exit(EXIT_FAILURE);
}

char *pghost,
*pgport,
*pgoptions,
*pgtty,
*dbname,
*query,
*cursor_command,
*login,
*pwd;
int nFields;
int i, j;

pghost = argv[1];
dbname = argv[2];
login = argv[3];
pwd = NULL;
query = argv[4];


PGconn *conn;
PGresult *result;

// pghost = "localhost";
pgport = NULL;
pgoptions = NULL;
pgtty = NULL;
// dbname = "memoria_sql";

//conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbname);
conn = PQsetdbLogin(pghost, pgport, pgoptions, pgtty, dbname, login, pwd);

if(PQstatus(conn) == CONNECTION_BAD){
fprintf(stderr, "Conexión fallida con la base de datos %s\n", dbname);
fprintf(stderr, "%s", PQerrorMessage(conn));
exit_nicely(conn);
}

// Transaccion
result = PQexec(conn, "BEGIN");

if(!result || PQresultStatus(result) != PGRES_COMMAND_OK){
fprintf(stderr, "Imposible realizar transaccion\n");
PQclear(result);
exit_nicely(conn);
}

PQclear(result); // Limpiamos el result para evitar fugas de memoria

cursor_command = (char *) malloc((size_t)1024*sizeof(char));

sprintf(cursor_command, "DECLARE mycursor CURSOR FOR %s", query);

result = PQexec(conn, cursor_command);

if(!result || PQresultStatus(result) != PGRES_COMMAND_OK){
fprintf(stderr,"Declaración de CURSOR fallida\n");
PQclear(result);
exit_nicely(conn);
}

PQclear(result);

result = PQexec(conn, "FETCH ALL in mycursor");

if(!result || PQresultStatus(result) != PGRES_TUPLES_OK){
fprintf(stderr,"El comando no regreso ninguna tupla.\n");
PQclear(result);
exit_nicely(conn);
}


nFields = PQnfields(result);

for(i = 0; i < PQntuples(result); i++){

printf ("\n\n=========================\n\t=> Registro: %d\n=========================\n\n", i+1);

for(j = 0; j < nFields; j++){
printf("%-15s: %-15s\n", PQfname(result, j), PQgetvalue(result, i, j));

//printf("\n");
}
}

PQclear(result);

result = PQexec(conn, "CLOSE mycursor");

PQclear(result);

// Aseguramos la transaccion
result = PQexec(conn, "COMMIT");

PQclear(result);

PQfinish(conn);

return 0;
}


void exit_nicely(PGconn *conn){
PQfinish(conn);
exit(1);
}




Saludos...

Tiempo fugaz

Hoy desperte con un dejo de tristeza, al mirar que todo lo construido se derrumba, al pensar en mis viejos amigos, antiguos amores, que se yo, tanto nos perdemos con el paso del tiempo y ni siquiera nos damos cuenta.

Solo pasa el tiempo, o el tiempo nos pasa, no lo se, pero a todo esto le llamamos vida. Vivimos creyendo que somos importantes para la vida, pero la vida es mas importante para nosotros.

Somos tan egoistas, pensando en el pasado y queriendo regresar a el, que no nos damos cuenta a lo mucho que renunciamos en el presente.

martes, 24 de julio de 2007

Cambiar los passwords de usuario en PostgreSQL

Primero que nada nos convertimos en superusuario:

$su root

Ya teniendo privilegios nos convertimos en usuario postgres que es el superusuario de la base de datos pero un simple mortal para el filesystem.

#su postgres

ya como postgres solo falta entrar en la base de datos principal "template1"

$psql template1

y de ahi, cambiamos el password del usuario en cuestion.

alter user nombre_usuario with encrypted password "x password";

y yeah, asi de facil.

Bye...

Problemas con parseInt("08") & parseInt("09") de Javascript

El problema se suscita cuando necesitamos convertir la cadena de texto "08" o "09" en un valor entero y al emplear parseInt nos regresa el valor 0. Pero ¿Porque?, pues simple, parseInt emplea como estandar la base de codificación octal y en octal no existen los valores 08 y 09, para solucionarlo debemos de emplear la notación complementaria de parseInt.

Como un ejemplo vale mas que mil palabras, pues aqui esta el ejemplo:

var m = parseInt("08", 10);

con esto obtenemos el valor convertido en entero de la cadena "08" en "m".

Saludos...

sábado, 14 de julio de 2007

Obtener el numero de dias que lleva transcurrido el año en PostgreSQL (Fecha jualiana)

Con la siguiente query, obtenemos el numero de dias transcurridos del año en curso. La solución emplea aritmetica de fechas y fue probada en PostgreSQL 8.2 sobre Ubuntu Linux.

SELECT date_trunc('days', now() - (select cast(date_trunc('year', current_date) as date) as curr_year)::date) + interval '1 day' as dias_transcurridos;


Otra forma simplificada de esto seria mediante la funcion to_char() de postgresql y quedaria de la siguiente forma:

SELECT to_char(now(), 'ddd');

Saludos ;)

Bahia desde el balcon...

Bahia desde el balcon...
Ixtapa Zihuatanejo