Ene 302013
 

En nuestro anterior artículo de Introducción a Berkeley DB hemos presentado este sistema de base de datos y hemos comentado sobre las características y funcionalidad que ofrece. En éste vamos a ver ejempos prácticos de uso de Berkeley DB en un script en lenguaje perl.

Instalación

El software de manejo de bases de datos Berkeley es una librería que debe estar instalada en el sistema, utilizando el procedimiento de instalación que ofrezca el sistema operativo. Por ejemplo, en muchas distribuciones Linux, utilizamos el comando “apt-get”:

$ apt-get install libdb5.1

Para trabajar en perl con una base de datos Berkeley, debemos instalar también el módulo BerkeleyDB disponible en CPAN

cpan> install BerkeleyDB

Crear/abrir una base de datos

El siguiente código abre una base de datos Berkeley de tipo Hash contenida en el fichero “/home/datos.db”. Al haber especificado el flag DB_CREATE, si la base de datos no existía previamente se crea una nueva.

#!/usr/bin/perl

  use BerkeleyDB;

  my $filename = '/home/datos.db';
  my $dbh = new BerkeleyDB::Hash(
          -Filename => $filename,
          -Flags    => DB_CREATE)
          or die "Error abriendo $filename : $! $BerkeleyDB::Error\n";

Añadir registros

En Berkeley DB, un registro es un conjunto (clave, valor). Para añadir un registro, simplemente llamamos a la función db_put del objeto $dbh:

my $clave = "Esto es la clave";
my $valor = "Este es el valor asociado a la clave";
$dbh->db_put($clave, $valor);

 

Recorrer el contenido de la base de datos

Para obtener todos los registros de la base de datos, abrimos un cursor:

    my $cursor = $dbh->db_cursor() ;
    while ($cursor->c_get($k, $v, DB_NEXT) == 0) {
        print "Clave: " . $k . ", valor: " . $v . "\n";
    }

Determinar si una clave existe, y obtener el valor asociado

Para obtener el valor asociado a una clave, utilizamos una llamada a db_get de la forma:

my $clave = "Esto es la clave";
my $valor;
my $status = $dbh->db_get($clave, $valor);
if ($status) {
    print "Error: " . $status . "\n";
} else {
    print "Valor: " . $v . "\n";
}

La llamada a db_get lee de la base de datos el valor asociado a la clave, y lo guarda en la variable $valor. Si se produce algún error, devuelve un mensaje de error. Así, como vemos en el ejemplo, podemos determinar si la clave existe comprobando la variable $status.

Si sólo queremos determinar si una clave existe, pero no necesitamos recuperar su valor, podemos utilizar la función db_exists:

my $no_existe = $dbh->db_exists($clave);
if ($no_existe) {
    print "La clave $clave no existe en la base de datos\n";
}

Almacenamiento de estructuras de datos

A menudo, podemos estar interesados en almacenar en la base de datos estructuras de datos: arrays, hashtables, que a su vez pueden contener referencias a otras estructuras de datos. Para ello, debemos serializar la estructura, de forma que se convierte en un único valor que puede ser guardado, y que puede ser convertido de nuevo en la estructura de datos original mediante el proceso inverso de deserialización.

En perl existen varios módulos que implementan esta funcionalidad, entre los cuales JSON::XS es uno de los más populares. En el siguiente ejemplo vemos cómo se utiliza este módulo:

use JSON::XS;

# Estructura de datos que queremos almacenar
my %estructura;

# Codificamos la estructura en forma de string
my $json = encode_json(%estructura);

# Y la guardamos en la base de datos
$dbh->db_put($clave,$json);

y de la misma manera, podemos recuperar un valor guardado como una cadena json, y recuperar la estructura:

$dbh->db_get($clave, $json);

my $hr_estructura = decode_json($json);

Por otra parte, si los valores a almacenar son de un tamaño considerable (superior a 1 KByte), y la base de datos tiene un gran número de registros, nos puede interesar comprimirlos. Para ello podemos utilizar los módulos IO::Compress::Deflate y IO::Uncompress::Inflate.

  use IO::Uncompress::Inflate qw(inflate);
  use IO::Compress::Deflate qw(deflate);

  # variables escalares
  my $datos;
  my $datos_comprimidos;

  # comprime los datos. el método deflate espera que sus argumentos
  # sean referencias a variables escalares.
  deflate $datos => $datos_comprimidos;

  # descomprime los datos comprimidos también el metodo inflate
  # recibe como argumentos referencias a variables escalares
  inflate $datos_comprimidos => $datos;

 Publicado por en 11:23 pm

 Deja un comentario

(requerido)

(requerido)