Introducción
Hola a todos!, acá les escribo la segunda parte del tutorial sobre bases de datos tipo TXT (como el DBF), en donde mediante algunas simples funciones podemos administrar los registros y las tablas de la base de datos, sin tener la necesidad de usar grandes motores de bases de datos, ya que solo necesitamos el interprete de perl para utilizarlo.
NOTA: Recuerda que para comprender totalmente este tutorial, debes de leer la
Primera Parte.
Más Funciones...
Para este tutorial les escribí 3 funciones más...que junto con las anteriores ya nos dan una buena base como para administrar nuestra base de datos sin problemas.
Estas funciones son:
- delete: elimina un elemento buscando un valor numérico del campo id
- selects_by_2_numbers: Selecciona todos los registros de la tabla que coincidan con dos patrones numéricos, por ejemplo, que el campo edad sea = a 23 y que el campo altura sea = a 180.
- delete_by_string: Elimina un retistro de la tabla buscando un valor alfabético.
Muy bien, demos un vistazo a las nuevas funciones.
Delete
sub delete {
my (@registros,@new_registros);
open (DATABASE, "<$_[0]") || &error('abrir','archivo');
flock (DATABASE,1)||&error('lock','file');
@registros = <DATABASE>;
close (DATABASE) || &error('cerrar','archivo');
foreach $registro (@registros){
$registro =~ s/\n//g;
my($id,@basura) = split(/\|\|/, $registro);
if ($id != $_[1]){
push (@new_registros,$registro);
}
}
open (DATABASE, ">$_[0]") || &error('abrir','archivo');
flock (DATABASE,2)||&error('lock','file');
foreach $new_registro (@new_registros){
print DATABASE "$new_registro\n";
}
close (DATABASE) || &error('cerrar','archivo');
}
Para usar esta funcion le debemos pasar por parámetro 2 valores:
Primero el nombre de la tabla y Segundo el número del campo ID que queremos eliminar. Por ejemplo:
&delete('usuarios.txt',5);
#elimina al usuario cuyo id es 5
Selects by 2 numbers
sub selects_by_2numbers {
my (@registros,$registro,@recordset,@return_recordset);
open (DATABASE, "<$_[0]") || &error('abrir','archivo');
flock (DATABASE,1)||&error('lock','file');
@registros = <DATABASE>;
close (DATABASE) || &error('cerrar','archivo');
shift (@registros);
foreach $registro (@registros){
@recordset = split (/\|\|/, $registro);
if ($recordset[$_[1]] == $_[2] and $recordset[$_[3]] == $_[4]){
push(@return_recordset,$registro);
}
}
return (@return_recordset);
}
Esta función es como el select normal solo que tiene dos complicaciones más, la primera es que al sacar el LAST, el bucle foreach seguirá dando verificando todos los registros en busca de coincidencias en el if, así en ves de retornarnos solo un registro nos retorna todos los registros que cumplan con esa condición. La segunda complicación es que en el if colocamos 2 condiciones para que verifique...también se pueden poner más y tanto con == para números como en eq para letras.
Para llamar a esta función lo debemos hacer pasándole 5 parámetros:
- 1 el nombre del archivo
- 2 el número de comumna en donde se encuentra el primer dato a comparar
- 3 el valor que ese dato que queremos comparar para seleccionar el registro
- 4 el número de comumna en donde se encuentra el segundo dato a comparar
- 5 el valor que ese dato que se va a comparar (segundo caso)
Por ejemplo:
my @recordset = &selects_by_2_numbers('usuarios.txt',2,3,5,7);
Esta función nos retornará un array con todos los registros seleccionados, pero cada registro (elemento del array) tiene todas las columnas unidas por || de forma que un posible resultado puede ser:
5||monoswim||3||password||esteban||7||masdata...
9||kidd||3||password||uriel||7||masdata...
Vemos como las posiciones 2 y 5 tienen los valores 3 y 7 respectivamente como habíamos puesto en el select (cabe destacar que empieza a contar desde 0 y no desde 1).
Delete by String
sub delete_by_string {
my (@registros,@new_registros,@data);
open (DATABASE, "<$_[0]") || &error('abrir','archivo');
flock (DATABASE,1)||&error('lock','file');
@registros = <DATABASE>;
close (DATABASE) || &error('cerrar','archivo');
foreach $registro (@registros){
$registro =~ s/\n//g;
(@data) = split(/\|\|/, $registro);
if ($data[$_[1]] ne $_[2]){
push (@new_registros,$registro);
}
}
open (DATABASE, ">$_[0]") || &error('abrir','archivo');
flock (DATABASE,2)||&error('lock','file');
foreach $new_registro (@new_registros){
print DATABASE "$new_registro\n";
}
close (DATABASE) || &error('cerrar','archivo');
}
Una función muy parecida a delete, con la única salvedad de que esta lo hace mendiante eq en vez de == con lo cual verifica que la igualdad se de alfabéticamente y no numéricamente.
NOTAS FINALES
Con estos dos tutoriales ya contamos con una base más que suficiente para utilizar este tipo de bases de datos, no creo que haya mayores complicaciones...ya que a lo largo de los mismos vimos todos (o casi todos) los puntos importantes a tener en cuenta.
PD: Ante cualquier crítica, consulta o pregunta les dejo mi mail: [email protected].