Introducción
Las bases de datos del tipo TXT son una heramienta muy cómoda y fácil de usar, que nos brindan la posibilidad de agregarle pequeñas funcionalidades y dinámismo a nuestros sitios web, sin tener la necesidad de usar grandes motores de bases de datos, que si son necesarias para proyectos web de mayor envergadura.
Posibles usos para Bases de Datos tipo TXT:
- 1 Crear sitios web dinámicos, donde parte de la información o código HTML se almacena en estas bases de datos
- 2 Aliviar el trabajo de nuestro motor de bases de datos como MySQL si tenemos un sitio muy visitado y con muchas conecciones a la base.
- 3 Crear contadores de visitas multipágina para realizar el seguimiento del sitio web.
- 4 Crear libros de visitas en donde se almacenan los mensajes de los usuarios.
- 5 Crear Error-Logs en donde se almacenan todos los errores que van ocurriendo.
- 6 Realizar log de usuarios, con nombre y contraseñas
- etc...
Base de datos tipo TXT...¿¿Qué es esto???
Las bases de datos tipo txt es una de las maneras más simples de realizar una base de datos, razón por la cual todos los grandes motores de bases de datos permiten exportar las tablas a este formato, creando un archivo TXT por cada tabla de la base.
De manera que si teníamos en MySQL una tabla llamada clientes, de esta manera tendremos el archivo clientes.txt similar al famoso formato .dbf, pero, ¿cómo funciona? Simple: cada archivo txt equivale a cada tabla de la base de datos, cada linea del archivo equivale a cada registro de la tabla, en donde los campos vienen separados por el string "||" de manera que podemos tener algo como:
Se ve más simple ahora que sabemos de que se trata...no???
NOTA: Algo para remarcar es que siempre voy a usar un campo id que será autoincremental.
Librería de funciones
Como siempre lo primero que haremos es una librería en donde estarán las funciones para administrar la base de datos, estas funciones son las que nos permitirán realizar la alta, baja y modificaciones de cada registro de la base de datos.
A esta librería la llamaremos txtdb_lib.pl y tendrá el siguiente código:
sub open_db {
my (@registros);
open (DATABASE, "<$_[0]") || &error('abrir','archivo');
flock (DATABASE,1)||&error('lock','file');
@registros = <DATABASE>;
close (DATABASE) || &error('cerrar','archivo');
shift (@registros);
return (@registros);
}
sub select_by_number {
my ($i,@registros,$registro,@recordset,%return_recordset,$registro_cero,@nombres,$cant_reg,$cant_reg_cero);
open (DATABASE, "<$_[0]") || &error('abrir','archivo');
flock (DATABASE,1)||&error('lock','file');
@registros = <DATABASE>;
close (DATABASE) || &error('cerrar','archivo');
$registro_cero = shift (@registros);
$registro_cero =~ s/\n//g;
@nombres = split (/\|\|/, $registro_cero);
$cant_reg_cero = @nombres;
foreach $registro (@registros){
$registro =~ s/\n//g;
@recordset = split (/\|\|/, $registro);
if ($recordset[$_[1]] == $_[2]){
$cant_reg = @recordset;
if ($cant_reg != $cant_reg_cero){&error('procces','database- no coinsiden las cantidades de registros')}
while ($i < $cant_reg){
$return_recordset{$nombres[$i]} = $recordset[$i];
$i++;
}
last;
}
}
return (%return_recordset);
}
sub insert {
my ($urldb,@data,@registros,$ultimo_registro,$id,@basura,$new_registro);
($urldb,@data) = @_;
open (DATABASE, "<$urldb") || &error('abrir','archivo');
flock (DATABASE,1)||&error('lock','file');
@registros = <DATABASE>;
close (DATABASE) || &error('cerrar','archivo');
$ultimo_registro = @registros;
$ultimo_registro = $ultimo_registro - 1;
($id,@basura) = split(/\|\|/, $registros[$ultimo_registro]);
$id++;
$new_registro = $id;
foreach $data (@data){
$data =~ s/\n//g;
$new_registro .= "||$data";
}
open (DATABASE, ">>$_[0]") || &error('abrir','archivo');
flock (DATABASE,2)||&error('lock','file');
print DATABASE "$new_registro\n";
close (DATABASE) || &error('cerrar','archivo');
}
Veamos un poco a cada función:
open_db(): Esta función es talvéz la más tonta de todas pero la más útil a la hora de saber que es exactamente lo que tienen nuestras tablas...simplemente abre el manejador de archivos, lo bloquea para que sea de solo lectura y carga cada registro en una variable del estilo @array de manera que cada registro de la base de datos vendrá dado en un solo elemento del array, con todos los campos separados por||, que luego tendremos que separar usando la función split.
select_by_number(): Selecciona un registro según el número que querramos, en el campo que querramos, datos que le tendremos que pasar a la función al llamarla. Como verán esta función (que selecciona solo un registro) devuelve una variable hash conteniendo el nombre del campo y sus respectivos valores. para llamar a esta función debemos usar en nuestro script:
%tabla_data = &select_by_number('tabla.txt','0','4');
Así estamos seleccionando de la tabla "tabla.txt" el registro 4 del campo 0 (o sea el campo id)
insert(): Esta función es la más importante del tutorial, ya que es la que realiza el autoincremento del campo id, que en si es lo más importante de las tablas ya que gracias a eso podremos realizar búsquedas binarias y demás algoritmos que nos permiten acelerar mucho las búsquedas, haciéndolas mucho más rápidas.
Lo que hace esta función es abrir la base de datos, contar el último id, sumarle uno, y guardar el nuevo registro con ese id sumado y con el resto de la información que le hallamos pasado. De maneta que para llamar a esta función debemos usar algo así:
&insert(tabla.txt'',@data);
Como ya verán esta función no devuelve ningún valor específico.
Notas Finales
Este tutorial no pretende enseñar a realizar un motor de base de datos ni nada de eso, sino simplemente demostrar como con las herramientas que tenemos en PERL más un poco de ingenio se puede ir haciendo algo que nos permita crear mini aplicaciones sin tener la necesidad de instalar nada adicional...y que el día de mañana podamos mudar fácilmente a cualquier motor de base de datos.
Otro objetivo de este tutorial es el pedagógico, ya que yo aprendí mucho haciendo esta clase de cosas y pienso que a ustedes les puede pasar lo mismo. Es probable que más tarde escriba una segunda parte de este tutorial mostrándoles algunas otras funciones que alguna ves hice cuando estaba desarrollando este tipo de herramientas.
Gracias por visitarlo y espero que les sirva.