Usuario:UnRar/UDB

De Wikipedia, la enciclopedia libre

La UDB (siglas de Unrar DataBase) es una base de datos basada en texto plano. De momento, solo estoy trabajando en una API para PHP, aunque es muy posible que lo pase a Python cuando se haga la transición a Shiva. La UDB se basa en el protocolo BDD (Base de Datos Distribuída) de IRC-Hispano, y siguiendo la filosofía KISS.

Los nombres usados son:

  • Peggy - Una versión de Sybil para pruebas locales (sin conexión a IRC).
  • Marcia - Pseudocódigo.

Estructura[editar]

En la UDB no hay campos, filas, ni nada de ese argot de las SQL. El concepto de tabla es en realidad un fichero plano con extensión .udb, por ejemplo clientes.udb. Las tablas no tienen ningún tipo de estructura, por lo que se manejo se debe parsear a mano (o con un Framework).

El "punto clave" de las tablas son los delimitadores, osea, lo que hay entre campo y campo (así se permiten los espacios). Ese carácter se suele usar explícitamente cada vez que se hace una "consulta" a la UDB, o se almacena en la variable $udb_dl. Por lo tanto, una tabla con un delimitador %! podría ser así:

 Juan Carlos%!Barcelona%!17-03-1993%!23-11-2012 

No quiere decir nada, pero con un simple parseador podríamos hacer, con una regex, algo así:

 Nombre cliente%!Domicilio%!Nacimiento%!Fecha de ingreso 

Aplicaciones[editar]

Para facilitar el parseo, estoy trabajando en una espécie de API para facilitar el parseo. Aunque lo mejor es crear funciones específicas para cada proyecto. Por ejemplo, esta comprueba si un nick dado aparece en algún campo de nas.udb:

function nick_exists_udb( $nick ) {
	$udb_nas = fopen("nas.udb", "r");
	$nas_found = false;
	while (!feof($udb_nas)) {
		$nas_line = fgets($udb_nas);
		$nas_expl = explode('~!', $nas_line);
		foreach ($nas_expl as $nas_vnick) {
			if (trim($nas_vnick) == $nick) { 
				$nas_found = true;
				$nas_aname = $nas_expl[0];
			}
		}
	}
	if ($nas_found != true) { 
		return false;
	} else {
		return $nas_aname;
		unset($nas_found);
	}
	fclose($udb_nas);
}

Por regla general, se suelen usar prefijos o sufijos udb. También es, por desgracia, muy frecuente tener que usar variables "de usar y tirar". En esos casos, se suelen usar siglas estúpidas, como $udb_dbo. La API -aún en construcción- provee una espécie de recolector de basura que "unsetea" las variables basura automáticamente.

La UDB está pensada para proyectos que, ante todo, requieran velocidad. Es mucho más rápido llamar a una función que haga un rápido parse de un texto plano que hacer una consulta SQL. Otra ventaja de la UDB es que, pesé a ser implementada en UnBot, no tiene ninguna preferencia en cuanto a uso. O lo que es lo mismo, no por estar desarrollada en conjunto con UnBot tiene preferencia para el uso conjunto con un bot IRC. No cuenta con ninguna función especial, pero seguramente la API proveerá una clase madre para que el desarrollador pueda crear sus propias funciones heredando de ella, adaptadas a su proyecto (igual que la función nick_exists_udb, que está implementada en UnBot, NO en UDB).

UDBc[editar]

UDBc es un proyecto en construcción, escrito en PHP (aunque seguramente migrará a Python con Shiva), que sirve para mantener un caché de las consultas realizadas, así como de los parses. Por ejemplo, se podría ordenar a la UDB que creara un bloque UDBc que parsee automáticamente algo. Es ideal para las consultas muy típicas pero tediosas para PHP, ya que se realizan en UDBc en vez de en el servidor o núcleo del programa.

UDBc estará disponible como un módulo o como una aplicación a parte.

API[editar]

Actualmente, la API solo se usa con el mod_local (pruebas locales, fuera del IRC) de Peggy (módulo de pruebas de Sybil). Aún así, está ya implementada en UnBot. Solamente está creado el siguiente código, que permite abrir una conexión a una UDB y guardarla en caché. Puede parecer estúpido copiar el fichero .udb al fichero caché, pero al abrir bases de datos remotas... tiene su lógica.

<php /* UDB_connector

	@params none
	@version 2012.11.27.Sybil.PHP
	
	API para UDB.
*/

class UDB_connector {
	// @var $cachedb -> Lugar donde se guarda la consulta (por defecto = cache.ucb)
	var $cachedb ="cache.ucb";
	
	// rac: read and cache
	// @param pdb File to rac
	function rac ($pdb) {
		//Open file for reading
		$rpdb = fopen($pdb, 'rb');
		//Open cache database 
		$rcachedb = fopen($this->cachedb, 'w');
		while (!feof($rpdb)) {
			fwrite($rcachedb, fgets($rpdb));
		}
		fclose($rcachedb);
		fclose($rpdb);
	}
	
	// connect: Conecta a una UDB
	// @param fdb File DataBase
	// @param nocache bool No guardar en la caché
	function connect ($fdb, $nocache = false) {
		if ($nocache == true) {
			if (file_exists($fdb)) {
				return true;
			} else {
				return false;
			}
		} else {
			if (!file_exists($fdb)) {
				return false;
			} else {
				$this->rac($fdb);
				return true;
			}
		}
	}
} ?>

Como es un objeto, se puede implementar fácilmente en cualquier programa PHP. He aquí un ejemplo de su uso en Peggy:

<?php
// UDB: LoadLibs
require("udb_connector.php");

// UDB: ConfVars
// $udb_del -> Delimitador
$udb_del = "&%";
$udb_c = new UDB_connector;

// Conectemos a udbd.udb
$coco_udd = $udb_c->connect("udd.udb");
if ($coco_udd) {
echo "Se pudo conectar a UDD!\n";
} else {
echo "No se pudo conectar a UDD.\n";
}

$coco_udbd = $udb_c->connect("udbd.udb");
if ($coco_udbd) {
echo "Se pudo conectar a UDBD!\n";
} else {
echo "No se pudo conectar a UDBD\n";
}
?>

La opción $nocache de connect sirve para no guardar la UDB en caché. Eso puede parecer confuso con la API actual, pero en el pseudocódigo desarrollado esto permite operar directamente con una UDB remota, lo que en algunos casos puede interesar.

Las funciones ya desarrolladas en pseudocódigo de la API (pseudocódigo de 2012.11.28-Marcia) son:

  • disconnect - Eliminar el fichero de caché y/o desconectarse de la UDB. Eliminación de todas las variables de UDB.
  • add - Añade una fila a la UDB abierta. Uso: $u->add('campo 1', 'campo 2', 'campo X');. Se añade automáticamente el separador.
  • delm - Busca una fila que empiece por REGEX y la elimina. Uso: $u->delm('REGEX');.
  • del - Elimina la línea dada (en número). Uso: $u->del('X');.
  • rest - Hace una copia del caché en $cachebd.'.cbu' y ejecuta $this->disconnect.
  • reset - Desconecta y conecta, reseteando el caché.

Es poco probable pero no imposible que en la versión final estas funciones sean reemplazadas, eliminadas o modificadas.