LAZARUSDV
LAZARUSDV
LAZARUSDV
http://wiki.lazarus.freepascal.org/Lazarus_Databa...
lazarus wiki
OPEN SOURCE GUI RAD IDE FOR FREE PASCAL
VIEWS
Article Discussion Edit History
NAVIGATION
Contents
1 Introduccin 2 Lazarus y MySQL 2.1 1 - Poner a trabajar MySQL en Linux o Windows 2.2 2 - Poniendo a trabajar MySQL con FPC en modo texto 2.3 3 - Conectando a MySQL desde una Aplicacin Lazarus 3 Lazarus y PostgreSQL 4 Lazarus y SQLite 4.1 Introduccin 4.2 Requerimientos 4.3 Como usar la base de datos 5 Lazarus y MSSQL 6 Contribuidores y Cambios 7 Programas Lazarus que utilizan acceso a bases de datos
Main Page Documentation FAQ Downloads Glossary Index Recent changes Random page Help
TOOLBOX
What links here Related changes Upload file Special pages Printable version Permanent link
Introduccin
Este documento explica cmo hacer trabajar a Lazarus con una variedad de bases de datos. Por favor, expandir esta seccin.
WIKI SEARCH
Go Search
Lazarus y MySQL
by ChrisKirk 1. 2. 3. 4. Poner a trabajar MySQL en Linux o Windows, en modo consola. Poner a trabajar MySQL con FPC en modo texto. Poner a trabajar MySQL en un formulario Lazarus. Descargue el Cdigo fuente de ejemplo de MySQL
1 de 12
04/07/11 11:04
http://wiki.lazarus.freepascal.org/Lazarus_Databa...
est corriendo adecuadamente, y que todos los potenciales usuarios (incluyendo a root, mysql, usted mismo y cualquier otro que lo necesite) tengan tantos privilegios como requieran, desde la cantidad de hosts que sean necesarios (incluyendo a 'localhost', el nombre de la misma mquina y de las otras integrantes de su red) hasta el grado de seguridad que se requiera. Es recomendable que todos los usuarios, incluyendo a root, tengan contrasea. Pruebe el funcionamiento del sistema de base de datos usando los ejemplos dados en el manual y verifique que todos los usuarios posean acceso a la misma.
asegrese que todos los usuarios que lo necesiten tengan el apropiado privilegio de acceso a sta base.
GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword';
sto probablemente fallar, debido a que el sistema no debera permitir a un usuario annimo acceder a la base de datos. Por consiguiente modifique el script utilizando un editor para que la lnea que invoca a mysql diga:
mysql -u root -p ${1-testdb} << EOF >/dev/null
pruebe correrlo nuevamente, ingresando su contrasea cuando se la pida. Con suerte Ud. ya habra creado la base de datos de prueba, verifquelo (conectado a la consola de mysql) escribiendo la siguiente sentencia
select * from FPdev;
Debera ver la tabla listando el ID, nombre y direccin de email de algunos de los desarrolladores de FPC. Ahora trate de correr el programa de testeo testdb.pp (puede ser necesario compilarlo y seguramente fallar en el primer intento!). He encontrado que el programa no puede conectarse a mysql por diversas razones: Mi sistema (SuSE Linux v9.0) instala mysql v4.0.15, no la versin 3 para la cual fue diseado el programa. El programa necesita tener nombres de usuarios y contraseas para acceder a la base de datos. El compilador necesita saber dnde encontrar las bibliotecas mysql ( SI AN NO HA INSTALADO LAS BIBLIOTECAS DE DESARROLLO DE MYSQL, HGALO AHORA!)
2 de 12
04/07/11 11:04
http://wiki.lazarus.freepascal.org/Lazarus_Databa...
Gener una copia de testdb.pp llamada trydb.pp, en lugar de modificar el original (sto significa que el archivo original se actualizar automticamente en las siguientes actualizacione por CVS). Tambin copi los archivos encontrados en el subdirectorio mysql/ver40/ en el subdirectorio principal mysql/ , renombrandolos mysql_v4.pp, mysql_com_v4.pp y mysql_version_v4.pp, asegrese de renombrar las unidades dentro de cada archivo segn corresponda. Modifique la sentencia uses en trydb.pp a
uses mysql_v4
y la sentencia en mysql_v4.pp a
uses mysql_com_v4
y en /usr/lib debo encontrar el nombre real de la biblioteca mysqlclient. En mi caso utilic la lnea de comandos:
ln -s libmysqlclient.so.12.0.0 lmysqlclient
para crear un enlace simblico permitiendo a FPC encontrar la biblioteca. Como buena media tambin cre el link
ln -s libmysqlclient.so.12.0.0 mysqlclient
y ubiqu varios enlaces similares en otros directorios: no son estrictamente necesarios, pero por si acaso!. Parece que algunos usuarios necesitan agregar tembin el siguiente link:
ln -s libmysqlclient.so.12.0.0 libmysqlclient.so
Modifiqu trydb.pp para incluir el detalle del usuario, inicialmente agregando el host, usuario y contrasea como constantes:
const host : Pchar= 'localhost'; user : Pchar= 'myusername'; passwd: Pchar = 'mypassword';
Tambin me encontr que no poda conectarme a mysql usando la llamada mysql_connect(), la cual tiene muchos ms parmetros. Para complicar las cosas an ms, el nmero de parmetros parece haber cambiado entre la versin 3 (donde son siete) y la versin 4 (donde son ocho). Antes de usar mysql_real_connect tengo que usar mysql_init() la cual no se encuentra en el archivo original mysql.pp, pero si est en mysql_v4.pp. Por lo tanto, el cdigo para la conexin a la base de datos ahora es:
3 de 12
04/07/11 11:04
http://wiki.lazarus.freepascal.org/Lazarus_Databa...
{ a few extra variables} var alloc : PMYSQL; {main program fragment} begin if paramcount=1 then begin Dummy:=Paramstr(1)+#0; DataBase:=@Dummy[1]; end; Writeln ('Allocating Space...'); alloc := mysql_init(PMYSQL(@qmysql)); Write ('Connecting to MySQL...'); sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0); if sock=Nil then begin Writeln (stderr,'Couldn''t connect to MySQL.'); Writeln (stderr, 'Error was: ', mysql_error(@qmysql)); halt(1); end; Writeln ('Done.'); Writeln ('Connection data:'); {$ifdef Unix} writeln ('Mysql_port : ',mysql_port); writeln ('Mysql_unix_port : ',mysql_unix_port); {$endif} writeln ('Host info : ',mysql_get_host_info(sock)); writeln ('Server info : ',mysql_stat(sock)); writeln ('Client info : ',mysql_get_client_info); Writeln ('Selecting Database ',DataBase,'...'); if mysql_select_db(sock,DataBase) < 0 then begin Writeln (stderr,'Couldn''t select database ',Database); Writeln (stderr,mysql_error(sock)); halt (1); end; {... as original contents of testdb.pp}
Epaaa! Ya tengo la lista de desarrolladores de FPC! Unos cuantos refinamientos extras: haga interactivos la entrada del nombre de usuario y de los comandos a la base de datos, usando variables en vez de constantes y permita varias sentencias SQL usuarios, vea el cdigo fuente del programa donde el usuario es ingresado desde la consola, y el programa entra en un ciclo donde se aceptan comandos SQL (sin el punto y coma final) y se visualizan las respuestas, hasta que se ingresa la palabra 'quit'. Vea un ejemplo de salida
4 de 12
04/07/11 11:04
http://wiki.lazarus.freepascal.org/Lazarus_Databa...
Aumente el tamao del form hasta la mitad de la pantalla, lugo renmbre el formulario y su ttulo como 'TryMySQL'. Desde la pestaa de Componentes Standard ubique tres controles de edicin en el lado superior izquierdo e inmediatamente arriba de cada control ubique una etiqueta. Cambie los nombres y los ttulos a 'Host' (y HostLabel, HostEdit), 'UserName' (and UserLabel, UserEdit) y 'Password' (con PasswdLabel y PasswdEdit). Como alternativa podra haber utilizado el componente LabelledEdit desde la pestaa Adicionales. Seleccione el cuadro de edicin Passwd y busque la propiedad PasswordChar: cambiela a * o algn otro caracter, para que cuando ingrese la contrasea no aparezcan los caracteres en su pantalla y slo se muestren una serie de *. Asegrese que la propiedad Texto de cada cuadro de edicin est en blanco. Ahora ubique otra caja de edicin y una etiqueta en el extremo superior derecho de su formulario. Cambie la etiqueta a 'Ingrese el comando SQL' y nmbrelo como CommandEdit. Ubique tres botones en el formulario: dos en la parte izquierda, bajos los cuadros de edicin y uno a la derecha bajo el cuadro de comando. Nombre los botones en la izquierda como 'Conectar a la base de datos' (ConnectButton) y 'Salir' (ExitButton) y al de la derecha como 'Enviar consulta' (QueryButton). Ubique un campo memo largo etiquetado 'Resultado' (ResultMemo) en la parte inferior derecha que cubra la mayor parte del espacio. Busque su propiedad ScrollBars y seleccione ssAutoBoth, para que ambas barras aparezcan automticamente si el texto llena el espacio. Marque la propiedad WordWrap como Verdadera. Inserte una barra de estado (desde la pestaa Common Controls) en el fondo del formulario y ponga en la propiedad SimpleText 'TryMySQL'. Una captura de pantalla del formulario puede ser vista en: Ejemplo de pantalla Mysql Ahora necesitamos escribir el cdigo para manejar las acciones. Los tres cuadros de edicin de la izquierda son para el ingreso del nombre del host, usuario y contrasea. Cuando stos han sido completados satisfactoriamente, se debe hacer click en el botn Connect. El manejador del evento OnClick est basado en parte del programa en modo texto del FPC que describimos antes. Las respuestas desde la base de datos no pueden ser visualizadas usando las sentencias de Pascal write o writeln: en lugar de eso deben ser convertidas en strings y mostradas en el campo memo. Mientras que las sentencias write y writeln de Pascal son capaces de una conversin de tipos "al vuelo", el uso de un campo memo para visualizar la salida de texto necesita la explcita conversin de los tipos de datos al formato string, por ende las variables Pchar deben ser convertidas a string usando StrPass y los enteros se convierten con IntToStr. Las strings son mostradas en el campo Memo usando
procedure ShowString (S : string); (* display a string in a Memo box *) begin |trymysqlForm1.ResultsMemo.Lines.Add (S) end;
5 de 12
04/07/11 11:04
http://wiki.lazarus.freepascal.org/Lazarus_Databa...
procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject); (* Connect to MySQL using user data from Text entry boxes on Main Form *) var strg: string; begin dummy1 := trymysqlForm1.HostEdit.text+#0; host := @dummy1[1]; dummy2 := trymysqlForm1.UserEdit.text+#0; user := @dummy2[1] ; dummy3 := trymysqlForm1.PasswdEdit.text+#0; passwd := @dummy3[1] ;<br> alloc := mysql_init(PMYSQL(@qmysql)); sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0); if sock=Nil then begin strg :='Couldn''t connect to MySQL.'; showstring (strg); Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg); end else begin trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL'; strg := 'Now choosing database : ' + database; showstring (strg); {$ifdef Unix} : '+ IntToStr(mysql_port); showstring (strg); strg :='Mysql_port strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg); {$endif} : ' + StrPas(mysql_get_host_info(sock)); Strg :='Host info showstring (strg); Strg :='Server info : ' + StrPas(mysql_stat(sock)); showstring (strg); : ' + Strpas(mysql_get_client_info); showstring (strg); Strg :='Client info trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...'; if mysql_select_db(sock,DataBase) < 0 then begin strg :='Couldn''t select database '+ Database; ShowString (strg); Strg := mysql_error(sock); ShowString (strg); end end; end;
El campo texto en la derecha permite el ingreso de una sentencia SQL, sin el punto y coma final, cuando ud. ya ha completado la misma, el botn SendQuery es presionado y la sentencia es ejecutada, con los resultados devueltos dentro del cuadro ResultsMemo. El manejador del evento SendQuery es basado tambin en la versin de texto de FPC, con la salvedad que se deben convertir explcitamente los tipos de datos a formato string antes que sean visualizados en el cuadro. Una diferencia respecto del programa FPC modo texto es que, si ocurre un error en la sentencia, el programa no se detiene y no se cierra la conexin a MySQL, en lugar de eso, el control es devuelto al formulario principal y se da la oportunidad de corregir la misma antes de reenviar la sentencia. La aplicacin finaliza (con el cierre de la conexin a MySQL) cuando se hace click en el botn Exit. El cdigo para SendQuery es:
6 de 12
04/07/11 11:04
http://wiki.lazarus.freepascal.org/Lazarus_Databa...
procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject); var dumquery, strg: string; begin dumquery := TrymysqlForm1.CommandEdit.text; dumquery := dumquery+#0; query := @dumquery[1]; trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...'; strg := 'Executing query : ' + dumQuery; showstring (strg); if (mysql_query(sock,Query) < 0) then begin Strg :='Query failed '+ StrPas(mysql_error(sock)); showstring (strg); end else begin recbuf := mysql_store_result(sock); if RecBuf=Nil then begin Strg :='Query returned nil result.'; showstring (strg); end else begin strg :='Number of records returned : ' + IntToStr(mysql_num_rows (recbuf)); Showstring (strg); Strg :='Number of fields per record : ' + IntToStr(mysql_num_fields(recbuf)); showstring (strg); rowbuf := mysql_fetch_row(recbuf); while (rowbuf <>nil) do begin Strg :='(Id: '+ rowbuf[0]+', Name: ' + rowbuf[1]+ ', Email : ' + rowbuf[2] +')'; showstring (strg); rowbuf := mysql_fetch_row(recbuf); end; end; end; end;
Guarde su Proyecto y presione Run -> Run El cdigo completo del programa est disponible en Cdigo fuente del ejemplo by ChrisKirk
Lazarus y PostgreSQL
Este es un tutorial muy corto que explica como conectar mediante Lazarus (0.9.12>) con el gestor de base de datos PostgreSQL, tanto en conexin local como remota, utilizando TPQconnection. Despus de una correcta instalacin tanto de Lazarus como de PostgreSQL, debemos seguir los siguientes pasos: 1.- Situar en el formulario los siguientes componentes: COMPONENTE / UBICACION EN EL IDE PQConnection ---------> SQLdb SQLQuery ---------------> SQLdb SQLTransaction -------> SQLdb DataSource ----------> DataAccess DBGrid ----------------> DataControls 2.- En el inspector de objetos una vez seleccionado en el formulario PQConnection rellenar los valores de las siguientes propiedades: "transaction": objeto SQLTransaction.
7 de 12
04/07/11 11:04
http://wiki.lazarus.freepascal.org/Lazarus_Databa...
"Database name": nombre de la base de datos. "HostName": nombre de equipo que contiene el gestor de la base de datos que conecta a la base de datos. "UserName": login de usuario con acceso a dicha base de datos. "password": contrasena de acceso a la base de datos para el Username. 3.- Comprobar que SQLTransaction ha cambiado automticamente para apuntar a PQConnection. 4.- En SQLQuery rellenar lo siguiente: "transaction": con su respectivo objeto. "database": con su respectivo objeto. "SQL" : debemos rellenarlo con la consulta SQL que deseamos realizar (algo as como 'select * from anytable') 5.- En el objeto DataSource rellenar: "DataSet": objeto SQLQuery. 6.- En el componente DBGrid rellenar: "DataSource": objeto DataSource. 7.- Modificar todo para que figure como conectado (connected) y activo (active) TDBText y TDBEdit parecen funcionar pero (al menos para m) solamente muestra datos en la grid. Para cambiar contenido de la base de datos realizo la llamada al motor de la base de datos (DB Engine) mediante las siguientes sentencias de cdigo:
try sql:= 'UPDATE table SET setting=1'; PQDataBase.Connected:=True; PQDataBase.ExecuteDirect('Begin Work;'); PQDataBase.ExecuteDirect(sql); PQDataBase.ExecuteDirect('Commit Work;'); PQDataBase.Connected:=False; except on E : EDatabaseError do MemoLog.Append('DB ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message); on E : Exception do MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message); end;
Notas: Testeado en windows, Lazarus 0.9.12 + PgSQL 8.3.1 Algunos test realizados en linux, Lazarus 0.9.12 and PgSQL 8.0.x. Instalacin y errores: En los test realizados con la version 0.9.12 de Lazarus, presentan errores los campos de tipo "text" y "numeric". Se usan sin problemas los tipos char de tamao fijo, los int y float8. Algunas veces con tan solo reiniciar Lazarus se resuelven algunos errores estpidos. Despus de suceder algunos errores, las transacciones permanecen activas y deben desactivarse manualmente. Los cambios realizados en Lazarus por supuesto no son visibles hasta realizar una
8 de 12
04/07/11 11:04
http://wiki.lazarus.freepascal.org/Lazarus_Databa...
"transaction commited". El depurador integrado parece tener errores (al menos en la versin para windows) - en ocasiones trabajar fuera del IDE puede ayudar a encontrar los errores. En Linux ciertos mensajes de error se imprimen en la consola -- ejecutar los programas mediante la lnea de mandatos resulta til para obtener informacin extra para su depuracion. Error: "No puedo cargar el cliente PostgreSQL. Est instalado (libpq.so) ?" Aade la ruta (variable de entorno path) de bsqueda para libpq* donde se instal PostgreSQL. En Linux aade la ruta al fichero libpq.so a la seccin de librerias dentro del fichero /etc/fpc.cfg. Por ejemplo: -Fl/usr/local/pgsql/lib En windows, aade simplemente estas librerias en alguna de las rutas que figuren en la variable de entorno o bien en el directorio o carpeta donde se tenga guardado el proyecto. En windows yo copio todas las librerias que necesito de C:\Program Files\PostgreSQL\8.1\bin a otro directorio que figure en el PATH. Tambin se puede aadir este directorio C:\Program Files\PostgreSQL\8.1\bin al path que resulta bastante mas sencillo y sin tener que mover ficheros de sitio. Como un buen ejemplo funcional es ms til que mucho que se pueda contar, aqu os dejo un enlace a un programa escrito directamente para Lazarus y que con pequeas modificaciones os puede permitir conectar con PostgreSQL 8.x en mi caso la prueba la realic con 8.3 y funcion. La versin de Lazarus la 0.9.26 Beta. Lo compila sin problemas. http://paginas.fe.up.pt/~asousa/wiki/doku.php?id=proj:lazarus_projects easyDB (http://paginas.fe.up.pt/~asousa/wiki/doku.php?id=proj:lazarus_projects) , en la fecha en la que se traduce este prrafo en la web de descarga figura el fichero easy_db_plus.zip Es importante cambiar los valores de usuario, contrasea, base de datos a conectar y equipo con el que conectar que puede estar en red o no. Si no est en red puede valer con localhost 127.0.0.1 y si lo est pus el nombre del equipo. Lgicamente que el usuario y contrasea estn correctos y que permita realizar lecturas, escrituras, borrado, por lo que es mejor tener un postgreSQL en prueba con acceso total (que no est en produccin). En mi caso verifico el funcionamiento teniendo al mismo tiempo abierto PGADMIN III. Fijaos en la cantidad de librerias que ha incluido en el fichero comprimido, ya que a mi al menos no me ha pedido nada adicional. Un cambio que he realizado es copiar todas las librerias de C:\Archivos de programa\PostgreSQL\8.3\bin sobreescribiendo las que vienen, lo he vuelto a compilar y funciona aceptable (sobre todo para que librerias como libpq.dll al tratarse de una versin ms nueva debera estar ms optimizada). Otro enlace interesante que he encontrado es: http://mundohoy.el-mentor.com/index2.php?option=com_content&do_pdf=1&id=62 Permite obtener un documento con el ttulo Postgresql y Freepascal en FreeBSD.
Lazarus y SQLite
Introduccin
Para poder acceder a bases de datos basadas en el motor de SQLITE son necesarios los siguientes componentes (Ambos descendientes de TDataset) : TSqliteDataset: para acceder a bases de datos cuya versin sea 2.8.x.
9 de 12
04/07/11 11:04
http://wiki.lazarus.freepascal.org/Lazarus_Databa...
TSqlite3Dataset: para acceder a bases de datos cuya versin sea 3.x.x. Relacin de Ventajas/Desventajas: Ventajas: Flexibilidad: Los programadores pueden elegir entre usar o no el lenguaje sql, permitindoles trabajar con tablas de datos simples o tan complejas como se desee. Actualizacin automatica de las bases de datos: no hay necesidad de actualizar la base de datos manualmente desde comandos sql, una serie de procedimientos establecidos se encargaran de ello. Rapidez: realiza una cache en memoria de los datos, lo que permite una visualizacin y navegacin por los datos rpida. Estructura NO cliente/servidor: slo es necesario distribuir la librera de sqlite. Desventajas: Requiere la librera sqlite.
Requerimientos
Para bases de datos sqlite2: fpc 2.0.0 Lazarus 0.9.10 sqlite runtime library 2.8.15 o superior Para bases de datos sqlite3: fpc 2.0.2 Lazarus 0.9.11 sqlite runtime library 3.2.1 o superior ) Recomendaciones: La libreria sqlite est en el system PATH o en el directorio de trabajo. Bajo Linux ponga cmem como la primera unidad en uses . En debian y derivadas ( ubuntu, Mepis, Mint... ), para construir Lazarus sern necesarios los paquetes libsqlite-dev/libsqlite3-dev adems de los sqlite/sqlite3 (Tambin se aplica a OpenSuSe) Las ltimas versiones de Lazarus ( 0.9.23 o superiores ) ya incluyen por defecto el componente sqlite3, por lo que se recomienda su uso ya que es automticamente configurado por el entorno.
10 de 12
04/07/11 11:04
http://wiki.lazarus.freepascal.org/Lazarus_Databa...
Hacer doble clic en tiempo de diseo sobre el componente o usar el comando 'Create Table' del men contextual (aparece al pulsar con el botn derecho del ratn) y se mostrar un simple editor auto explicado de tabla. - Listado de tipos de datos soportados por TSqliteDataset y TSqlite3Dataset:
Integer AutoInc String Memo Bool Float Word DateTime Date Time LargeInt Currency
- Leer los datos de la base de datos Una vez que se ha creado la tabla basta usar el procedimiento 'Open' si la propiedad SQL no se estableci se devuelven todas las entradas de la tabla especificada en la propiedad 'TableName', es equivalente a ejecutar la sentencia SQL:
SQL:='Select * from TABLENAME';
Actualizar / Modificar los datos de la base de datos Para actualizar los datos se usa la funcin 'ApplyUpdates'. Para poder usar la funcin la tabla de datos ha de contener alguna entrada que cumpla las condiciones de clave primaria ( los valores tienen que ser UNIQUE y not NULL). Se recomienda encarecidamente el diseo de la base de datos mediante paradigmas relacionales como el modelo relacional de Chen u otros antes de implementar la base de datos, de esta forma se garantiza la integridad referencial, el uso de claves primarias etc, que evitaran problemas en la implementacin Para que las tablas tengan claves primarias se puede: Establecer el nombre de la propiedad 'PrimaryKey' al nombre de la clave primaria de la tabla. Aadir la opcin AutoInc (autoincremento) al campo que deseamos que sea la clave primaria. De esta forma sqlite adoptar por defecto este campo como la clave primaria.
Lazarus y MSSQL
Por favor, escrbame!
Contribuidores y Cambios
Por favor, vea Log de actualizaciones para conocer la historia de modificaciones y agregados a esta pgina. http://lazarus-ccr.sourceforge.net/index.php?wiki=DbSpanishTutorial
http://wiki.lazarus.freepascal.org/Lazarus_Databa...
En el caso de facturlinex2 aparte de los paquetes dcpcrypt-2.0.4.1, powerpdf_20100305 e Inet utiliza el paquete de acceso a bases de datos ZEOSDBO-6.6.6-stable. Retrieved from "http://wiki.lazarus.freepascal.org/Lazarus_Database_Tutorial/es" Categories: Castellano | Espaol | Databases
This page was last modified 17:50, 1 May 2011. Content is available under .
12 de 12
04/07/11 11:04