Leer datos MySQL desde C++ sobre Linux

Resulta que algunas veces es necesario acceder desde C/C++ a MySQL, razones hay muchas…. el asunto es como hacerlo.

Antes de hacer cualquier cosa debemos instalar las librerías de desarrollo de MySQL:

sudo apt-get install libmysqlclient-dev

Todos los archivos que necesitaremos van a estar ubicados en /usr/include/mysql y /usr/lib/mysql , los parámetros para compilar un archivo simple es como sigue:

gcc archivo.cpp \
           -o archivo \
           -I/usr/include/mysql -L/usr/lib/mysql \
           -lmysqlclient -lstdc++ -lz

Una breve descripción de los parámetros:

  • -o (output) indica el nombre que va a tener el archivo de resultado
  • -I le dice al compilador que incluya una ruta adicional para los archivos de inclusión
  • -L le dice al enlazador que incluya una ruta adicional para los archivos de librería dependientes
  • -l (ele minuscula) le dice al enlazador que incluya la librería especificada
  • \ es el caracter que usamos en la linea de comando para ejecutar varias lineas como una sola expresión.

Escribí para ustedes un código de ejemplo, no es gran cosa pero les va a dar luces para sus proyectos:

//conexion.cpp
#include 
#include 
#include 
 
using namespace std;
 
int main(int argc, char *argv[])
{
    MYSQL mysql;
 
    mysql_init(&mysql);
    if (!mysql_real_connect(&mysql
		,"localhost"
		,"root"
		,""
		,"ciudades",0,NULL,0))
    {
        cerr<<"Horror ! : "
	    <

El resultado de la ejecución es:

ivancp@ubuntu$ ./conexion
01 AMAZONAS
02 ANCASH
03 APURIMAC
04 AREQUIPA
05 AYACUCHO
06 CAJAMARCA
07 CALLAO
08 CUSCO
09 HUANCAVELICA
10 HUANUCO
11 ICA
12 JUNIN
13 LA LIBERTAD
14 LAMBAYEQUE
15 LIMA
16 LORETO
17 MADRE DE DIOS
18 MOQUEGUA
19 PASCO
20 PIURA
21 PUNO
22 SAN MARTIN
23 TACNA
24 TUMBES
25 UCAYALI

Espero les sirva mucho!

MySQL Backups con crond

Muchos prefieren hacer backups de su valiosa data en formatos predefinidos por el gestor (.backup, .dbf, etc…) por mi parte prefiero el formato SQL guardado en un archivo de texto.

MySQL no tiene un formato SQL tan migrable que digamos (eso se puede arreglar), pero es muy util hacer mysqldump de vez en cuando.

Si lo que uno quieres es liberarse de la tarea de estar haciendo backups diarios o semanales (segun la paranoya de cada uno) puede utilizar anacron.

El comando para sacar una copia de la base de datos:

mysqldump -u backup munipuno > /... /munipunobackup.sql

Para que el comando de copia de seguridad se ejecute cada dia a eso de las 11.pm agregamos esta linea a la configuracion de nuestro anacron

0 23 * * * mysqldump -u backup munipuno > /var/log/backups/munipunobackup.sql

Para sacar una copia de toda la base de datos

mysqldump -u backup --all-databases > /var/log/backups/mysqlbackup.sql

Le pueden agregar el parametro –password=»clave» al comando por si se necesita. Lo unico malo es que no tendremos copias historias, solo un archivo: munipunobackup.sql Eso se puede arreglar con SH, pero luego.

InnoBase y Oracle

Hoy me llevé una tremenda sorpresa al ver el logo de Oracle
en la pagina de InnoBase Oy:

InnoBase

Averiguando por la red me enteré que Oracle, una de las empresas de produccción de software de base de datos mas grande de la tierra, se habia comprado la compañía que produce el motor de almacenamiento InnoDB que hoy en dia es una parte fundamental de MySQL.

Esto hace pensar que Oracle esta viendo a MySQL como un serio competidor, pero por otro lado Oracle apoya el desarrollo de software libre, eso es evidente por que se instala con Apache y tambien hay versiones para Linux.

Entontre un comentario en MySQL-Hispano.com con casi las mismas preguntas que se me vino a la mente cuando me enteré de esto. http://www.mysql-hispano.org/index.php?m=read&id=397

En la pagina de Oracle anuncia la bienvenida de Innobase, indicando que seguirá apoyando el software libre, tambien indica que se espera renovar los vinculos con MySQL el proximo año.

http://www.oracle.com/innodb/index.html

Finalmente, esperemos que MySQL no deje de crecer y que Oracle no se lo «trague».

MySQL 5 Paso la prueba

MySQL Hace unos dias que estoy haciendo pruebas de rendimiento en MySQL 5.0 y paso todas las pruebas de rendimiento que le hice.

MySQL esta en los corazones de muchos de nosotros, por eso se hace dificil dejarlo. Pensé seriamente en dejar de utilizarlo y migrar todo a un gestor, tambien libre y mas poderoso (pero no tan popular): PostgreSQL. Las utltimas pruebas de rigor fueron definitivas: Me quedo con MySQL!

Pero eso no quiere decir que no se presenten errores en el futuro. Si alguien encuentra algun error en este gestor puede postearlo en http://bugs.mysql.com/ Antes de postear un bug uno debe estar muy seguro que sea realmente un bug.

Hay una Apple iPod para quien encuentre un bug importante. Pueden ver los detalles en:

http://dev.mysql.com/mysql_5_contest.html

Filnalmente MySQL 5.0 !

MySQLEl 24 de Octubre me llego un mail con el asunto «MySQL 5.0 Now Available for Production Use», en esos dias estaba pensando seriamente en dejar de utilizar mi gestor de base de datos preferido y empezar con PostgreSQL, pero ahora tengo que pensarlo dos veces antes de cometer una locura.

MySQL ultimamente me ha estado fallando en algunas consultas y la necesidad de implementar procedimientos almacenados me hicieron dudar.

Ahora es momento de evaluar esta version y ver si realmente funciona y quedarme con MySQL hasta nuevo aviso.

En el mail describe estas (no tan nuevas) caracteristicas:

  • Stored Procedures and SQL Functions — to embed business logic in the database and improve performance;
  • Triggers — to enforce complex business rules at the database level;
  • Views — to ensure protection of sensitive information;
  • Cursors — to allow easier database development and reference of lar!
    ge datasets;
  • Information Schema — to provid!
    e easy a
    ccess to metadata;
  • XA Distributed Transactions — supports complex transactions across multiple databases in heterogeneous environments;
  • SQL Mode — provides server-enforced data integrity for new and existing data;
  • New Federated and Archive Storage Engines — MySQL’s unique pluggable storage engine architecture allows greater flexibility, functionality and performance by making it easy to swap database engines in and out, based on users’ application requirements;
  • New Migration Toolkit — A new graphical toolkit that completely migrates all data and objects from Oracle, Microsoft SQL Server, Microsoft Access and other database platforms to MySQL;
  • Instance Manager — new management assistant that allows remote starting/stopping of any MySQL Server, as well as remote editing of configuration files, reading of error and query logs, and more;
  • Updated Connectors and Visual Tools!
    — new high-performance versions of MySQL’s ODBC, Java and .NET database drivers are now available, along with updated versions of the MySQL Query Browser and MySQL Administrator.

Direccion de descarga:
http://dev.mysql.com/downloads/mysql/5.0.html

No tuve tiempo para traducir 😀

Detectar pais del visitante en PHP

PHP Logo Los webmasters nos preocupamos mucho por saber quienes son los que visitan nuestras páginas, para ello utilizamos herramientas muy útiles como contadores de visitas, analizadores de tráfico, etc., pero no siempre tenemos lo que queremos, no hay como hacer un script con tus propias manos.

Hace mucho tiempo encontré una base de datos (actualizada periódicamente) que contiene todos la mayoría de números IP que se pueden encontrar en la red. Estos están almacenados en forma de rangos y contiene el dato que nos interesa el País. Con esta base de datos es fácil determinar el país de procedencia del visitante a partir del numero  IP.

MaxMind es una empresa que provee este tipo de servicios y nos brinda un archivo libre (pero limitado) que podemos aprovechar.  http://www.maxmind.com/app/geolitecountry , solo tenemos que descargar el archivo e instalarlo en nuestra base de datos MySQL, sigan los pasos:

Paso 1: Descargar y Descomprimir la base de datos MaxMind (formato .csv):

wget http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
unzip GeoIPCountryCSV.zip  #contiene el archivo GeoIPCountryWhois.csv

Esta es una vista previa del archivo GeoIPCountryWhois.csv

...
"190.8.128.0","190.8.159.255","3188228096","3188236287","PE","Peru"
"190.8.160.0","190.8.163.255","3188236288","3188237311","PA","Panama"
"190.8.164.0","190.8.167.255","3188237312","3188238335","VE","Venezuela"
"190.8.176.0","190.8.179.255","3188240384","3188241407","CO","Colombia"
"190.8.180.0","190.8.183.255","3188241408","3188242431","EC","Ecuador"
"190.8.184.0","190.8.191.255","3188242432","3188244479","AR","Argentina"
"190.8.192.0","190.8.255.255","3188244480","3188260863","CO","Colombia"
"190.9.0.0","190.9.31.255","3188260864","3188269055","AR","Argentina"
"190.9.32.0","190.9.47.255","3188269056","3188273151","VE","Venezuela"
...

Luego debemos crear la tabla donde vamos a importar esos datos en formato csv:

CREATE TABLE ipdatabase
(
  str_ip_from varchar(15),
  str_ip_to varchar(15),
  ip_from int unsigned,
  ip_to int unsigned,
  country_code2 char(2),
  country_name varchar(50),
  KEY ip_from (ip_from),
  KEY ip_to (ip_to)
);

Es importante que los campos ip_from e ip_to sean int unsigned por que guardaremos números realmente grandes.

LOAD DATA LOCAL INFILE '/ruta_hacia/GeoIPCountryWhois.csv'
INTO TABLE ipdatabase
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';

Para poder mostrar las imágenes debemos tener las imágenes de las banderas de todos los países, pueden descargar un pack banderas en diferentes tamaños de: http://speckyboy.com/2010/08/04/top-10-country-flag-icon-sets/

Ahora todo esta listo para que podamos escribir el código PHP que determinara el registro al cual pertenece un determinado numero de IP:

$link = mysql_connect("localhost" , "ipdatabase", "pwd");
mysql_select_db("ipdatabase",$link);
$sql = "SELECT lcase(country_code2) as code,country_name as name ".
"FROM ipdatabase ".
"WHERE ip_from <= inet_aton('{$_SERVER['REMOTE_ADDR']}') ".        
"AND ip_to >= inet_aton('{$_SERVER['REMOTE_ADDR']}') ";
if($res = mysql_query($sql,$link)) 
{
if(mysql_affected_rows($link) > 0 && $row = mysql_fetch_array($res))
    $im = imagecreatefrompng("../images/flags/".$row['code'].".png");
else
    $im = imagecreatefrompng("../images/flags/-.png");
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
mysql_free_result($res);
}
else
{
echo mysql_error($link);
}
mysql_close($link);

El resultado del script anterior es el siguiente:

Usted nos esta visitando desde :

Ustedes pueden personalizar el código PHP para publicarlo en sus paginas web.

Espero les sirva.

Modificaciones a WordPress

Como habrán podido notar he mudado mi Blog hace ya mucho tiempo) de Blogger.com al sistema de publicación WordPress. WordPress esta escrito en PHP, la instalación es muy sencilla, es un súper blog-management absolutamente recomendable para quienes todavía no lo estén utilizando o piensan cambiar.

Desde el momento de la instalación he estado revisando el código fuente para hacer algunas modificaciones. El tema actual me gusta pero es muy común, así es que voy a tratar de hacer algunas mejoras de contenido. Tarea sencilla por que WordPress esta escrito en PHP y almacena los contenidos en MySQL.

WordPress Logo

Por lo pronto aumenté una sección de «Envíos Recientes» al estilo Blogger, y reacomodé el tema principal para poder incrustar los anuncios.

Para obtener los envíos anteriores al post actual utilizo la siguiente sentencia SQL en PHP, en el archivo single.php del tema por defecto:

$sql = "SELECT  year( post_date ) Anho,
          right(concat('0',month(post_date)),2) Mes,
          post_name,post_title FROM wp_posts
        WHERE binary `post_status` = 'publish'
          AND post_date  < '$post->post_date'
        ORDER BY  `post_date` DESC LIMIT 10";

Todavia no he revisado la documentación de las funciones, por lo que el resultado de la consulta anterior puede obtenerse de otro modo.

MySQL cada vez mejor

MySQL esta con nosotros desde hace ya mucho tiempo. Hemos podido notar que este gestor esta evolucionando cada vez y se esta convirtiendo en el gestor de datos que todos desearíamos que fuese.

MySQL se ha convertido en una seria amenaza para los gestores de datos como Oracle o SQL Server.

Segun un artíulo que encontre por la red:

MySQL toma nuevo impulso y ya es una seria amenaza para Oracle, IBM y Microsoft
Según varios analistas, la base de datos de código abierto MySQL puede convertirse en una serie competencia para gigantes como Oracle, IBM y hasta Microsoft. La última versión de esta plataforma libre incluye nuevas características -como sub-búsquedas y un nuevo formato binario- que fortalecen aún más su posición como una alternativa a las grandes empresas.

Estas no son novedades para quienes utilizamos constantemente MySQL, pero el resto ya lo esta empezando a tomar en serio.

MySQL y Visual C++

MySQL es un gestor de base de datos en plena evolución, inicialmente captó mi atención (como muchos) por que es liviano, rapido, confiable. Tiene algunos problemas en situaciones extremas, aun asi sigo siendo su fiel seguidor.

Como programador debo comentarles que, como casi todos los gestores, MySQL provee unas API’s que estan escritas en C/C++ las cuales pueden incluirse para implementar aplicaciones de acceso a base de datos sin necesidad de ODBC y esas cosas.

Para ello escribí un articulo respecto a eso: Como acceder a una base de datos MySQL desde Visual C++. Seguramente los seguidores mas romanticos del movimiento de Software Libre (el cual apoyo) se escandalicen al ver tal combinación, pero quienes utilizamos Visual C++ sabemos que no existe mejor compilador para Windows.

Estoy escribiendo un programa con las librerías GTK para que pueda correr en Linux. Pronto lo tendré listo.

Mientras tanto pueden descargar el articulo incluyendo el codigo fuente del proyecto y algunos archivos necesarios en esta dirección:

https://www.latindevelopers.com/ivancp/articulos/mysqlapi.pdf

Para que puedan tener mas referencia respecto a las API’s de MySQL pueden visitar:

http://dev.mysql.com/doc/mysql/en/mysql-apis.html

DBDesigner

Hace muchos años que desarrollo aplicaciones en Visual C++, casi todas las aplicaciones que desarrollé tienen que interactuar con bases de datos.

Mi gestor de base de datos preferido es MySQL, las razones las explicare en otra ocasión. Pero este post es para comentarles sobre la fabulosa herramienta de modelamiento de datos DBDesigner, que esta en su Version 4.

Esta herramienta ademas de tener una interfaz muy bien diseñada (utilizando tecnicas avanzadas), corre tambien en Linux.

Personalmente esoy acostumbrado a tener mis datos en forma de script’s SQL, DBDesigner tiene funcionalidad de obtener el modelo a partir de una base de datos existente (Ingeniería Inversa) lo que es muy util.

Hay muchas funcionalidades que tiene esta herramienta, se las recomiendo.

Pueden descargarse la ultima version desde http://www.fabforce.net/dbdesigner4/ Se distribuye gratuitamente bajo licencia GNU GPL.

Update!: DBDesigner esta descontinuado!, el sucesor es MySQL WorkBench