Notas sobre Malete, mayo 2005

Malete en Linux

Obtenemos el archivo malete.1.0.2.tgz en el sitio http://malete.org.

Extraemos su contenido:

tar xzvf malete.1.0.2.tgz

LGPL.txt
Makefile
Mingw.mk
README
Version
doc/.index
doc/CDS.txt
doc/CharSet.txt
doc/CmdLine.txt
doc/Converting.txt
doc/Diff09.txt
doc/DownLoad.txt
doc/FileFormats.txt
doc/IIF.txt
doc/MOM.txt
doc/MetaData.txt
doc/MultiProcess.txt
doc/OverView.txt
doc/Protocol.txt
doc/Query.txt
doc/RecStruct.txt
doc/Selene.txt
doc/Status.txt
doc/TagUse.txt
doc/Tcl.txt
mlt/Makefile
mlt/cds.c
mlt/cdx.c
mlt/core.h
mlt/db.c
mlt/dbo.c
mlt/hash.c
mlt/iif.c
mlt/malete.c
mlt/pw.c
mlt/pw.h
mlt/qdx.c
mlt/rdx.c
mlt/run
mlt/srv.c
mlt/sys.c
mlt/tool.h
mlt/uti.c
php/Isis.php
php/Isis/Db.php
php/Isis/Http.php
php/Isis/Rec.php
php/Isis/Server.php
php/demo.php
php/killidx.php
php/killqry.php
php/unicode.php
test/cds.m0d
test/cds.mqt
test/cds.mrd
test/unicode.m0d
test/unicode.mqt
test/unicode.mrd

Vemos que se crean cuatro directorios: doc, mlt, php y test.

En 'doc' encontramos la documentación, en forma de archivos de texto con una sintaxis al estilo wiki, a partir de los cuales se genera la versión HTML que está en el sitio web (malete.org).

En 'mlt' se encuentra el código fuente de Malete (archivos *.c y *.h), y el Makefile. Veamos la descripción de cada archivo:

cds.c	malete CDS/ISIS conversion
cdx.c	charset collation
core.h	full interface of the Malete core
db.c	implementation of general db access functions ***?
dbo.c	the db object
hash.c	the hashtable
iif.c	malete IIF(ISO2709/Z39.2)/MARC conversion
Makefile	-> Ver en particular la sección "demos and tests"
malete.c	malete main
pw.c	Malete patchwork functions
pw.h	interface of the Malete patchwork
qdx.c	the btree
rdx.c	implementation of general db access functions ***?
run	run demo server on test/cds (ver código más abajo)
srv.c	malete server
sys.c	I/O support for the openisis library
tool.h	interface of the Malete tools
uti.c	utilities

Este es el contenido del archivo 'run':

#!/bin/sh
#
# run demo server on test/cds
#
# $Id: run,v 1.1 2005/01/24 18:04:00 kripke Exp $
if [ ! -f ../test/cds.mqd ]; then
echo "loading cds index ..."
../bin/malete qload -vi cds -f../test/ -wa <../test/cds.mqt
fi
if [ x != "x$TEST" ]; then
../bin/malete server -vd cds -f../test/ -w <<EOF
cds.Q ${*:-PLANT WATER}
EOF
fi
../bin/malete server -vd -S cds -f../test/ -w

En 'php' se encuentran un par de demos y una biblioteca PHP que implementa funciones de lectura, escritura, consulta (query) e indización. Tenemos allí:

demo.php	demo for the Isis package
unicode.php	unicode demo for the Isis package

Dentro del subdirectorio 'Isis' están los 4 archivos que constituyen la biblioteca:

Db.php	class Isis_Db (This class represents a "database")
Http.php	class Isis_Http (This class represents the connection to a HTTP server)
Rec.php	class Isis_Rec (An ISIS(/IIF/Z39.2/ISO2709)-style record in pure PHP)
Server.php	class Isis_Server (This class represents the connection to an Isis server)

Finalmente, tenemos el directorio 'test', donde encontramos dos bases de datos: cds (la tradicional base distribuida por Unesco), y unicode (una pequeña base para probar el uso de Unicode en Malete). Cada base de datos está compuesta por tres archivos:

.m0d malete options (record 0) file (collation y qué más?)

.mqt malete query terms

.mrd malete record data

Es importante notar que se trata de archivos de *texto*.

En el directorio principal está el archivo README, que contiene unas instrucciones para que podamos comenzar a interactuar con Malete:

make -C mlt server
then check out php/demo.php
or telnet localhost 2042
and type (be careful to use a tab after the Q with queries!):
test.Q
test.Q
test.Q	water
test.Q	plant water?
test.Q	plant + dev$
test.Q

Sigamos entonces esas instrucciones, y veamos qué sucede. Comenzamos con el comando

make -C mlt server

Esto invoca al programa make, y le pasa dos argumentos: la opción '-C mlt' le indica que debe leer el Makefile del directorio mlt, y el target 'server' ...?

* Qué vemos en la pantalla: ver archivos log-error y log-out

El mensaje final es: listening on '*:2042'

* Qué nuevos archivos se han creado

Nuevo directorio 'bin':

cds.o db.o hash.o malete pw.o rdx.o sys.o
cdx.o dbo.o iif.o malete.o qdx.o srv.o uti.o

bin/malete es el ejecutable (279052 bytes)

Dentro de mlt, 1 archivo:

spanish.mcx	compiled collation file

(por qué spanish? por qué dentro de mlt?)

Dentro de test, 5 archivos:

test.m0d
test.mrd
test.mrx
test.mqd
test.mqx

Esta nueva base, llamada test, es una copia de la base cds que vino con malete. Más precisamente, los archivos test.m0d y test.mrd son copia, respectivamente, de cds.m0d y cds.mrd, mientras que

test.mqd se genera a partir de cds.mqt (malete qload)
test.mrx se genera a partir de test.mrd (malete dbinfo) ???
test.mqx se genera a partir de test.mqd y test.m0d (malete dbinfo) ???

Vamos a ver qué sucede al establecer una conexión vía telnet. Para esto abrimos otra consola:

[fernando@localhost openisis]$ telnet localhost 2042
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

El servidor Malete está listo para escuchar nuestros mensajes. Empecemos con “test.Q”, seguido por un doble enter:

test.Q
# 151 0 0
-9 1@0
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on: <plant physiology><plant transpiration><measurement and instruments>
24 Techniques for the measurement of transpiration of individual plants
26 aParis bUnesco c-1965
30 ap. 211-224 billus.
70 Magalhaes, A.C.
70 Franco, C.M.
-8 2@336
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on: <plant evapotranspiration>
24 <The> Controlled climate in the plant chamber and its influence upon assimilation and transpiration
26 c1965
30 ap. 225-232 billus.
70 Bosian, G.

[esos son los primeros 2 registros; siguen 18 más]

Cuando repetimos el mensaje “test.Q” (seguido, como en todos los casos, por doble enter), obtenemos los siguientes 20 registros de la base test:

test.Q
# 131 0 0
-8 21@6320
24 <The> Determination of the evaporation from the plant cover and the surface of the soil by relating lysimeter and soil moisture measurements to potential evaporation
26 c1965
30 ap. 461-465 billus.
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on: <evaporation><soil moisture><plant physiology><plant ecology><measurement and instruments>
70 Klausing, O.
-9 22@6741
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on: <water balance><water yield><forests><plant ecology><rain><run-off><Israel>
24 Water yields of forest, Maquis and grass covers in semi-arid regions: a literature review
26 c1965
30 ap. 467-477 billus.
70 Shachori, A.Y.
70 Michaeli, A.

[siguen hasta el registro 40]

Al usar una consulta vacía, estamos recuperando todos los registros de la base (véase Protocol.txt)

Probemos ahora con “test.Q water” (atención: luego de la Q hay un TAB):

test.Q	water
# 14 1 0
0 4
0 5
0 10
0 11
0 12
0 13
0 14
0 16
0 22
0 24
0 25
0 43
0 52
0 57

Lo que hemos hecho es una búsqueda por el término “water”, y lo que vemos es una lista de los 14 record-id (los MFN de cds-isis) correspondientes.

Pasemos a la siguiente consulta:

test.Q	plant water?
# 2 2 0
-9 5@1372
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 <plant physiology><soil moisture><plant transpiration><evapotranspiration><measurement and instruments>
24 Anti-transpirants as a research tool for the study of the effects of water stress on plant behaviour
26 c1965
30 ap. 269-274 billus.
70 Gale, J.
70 Poljakoff-Mayber, A.
-8 25@7420
24 <The> Heat, water and carbon dioxide budget of plant cover: methods and measurements
26 c1965
30 ap. 495-512 billus.
44 Methodology of plant eco-physiology: proceedings of the Montpellier Symposium
50 Incl. bibl.
69 Paper on: <energy balance><water balance><carbon dioxide><plant physiology><heat transfer><measurement and instruments>
70 Baumgartner, Albert

Hemos realizado la consulta “plant water?”, y hemos recuperado los registros 5 y 25. Esta consulta consta de dos partes: una búsqueda (plant water) y un filtro (en este caso, vacío).

Obtuvimos los registros, y no solamente los identificadores. Véase Protocol.txt:

If no filter is specified (i.e. no '?'), only record ids are returned.

Siguiente consulta, de acuerdo con la sugerencia del README:

test.Q plant + dev$
# 26 3 0
0 2
0 3
0 5
0 6
0 8
0 21
0 25
0 27
0 86
0 87
0 100
0 111
0 114
0 118
0 124
0 127
0 128
0 130
0 131
0 132

Como hay 26 registros y sólo recibimos los identificadores de los primeros 20, enviamos un nuevo mensaje “test.Q”:

test.Q
# 6 3 0
0 133
0 134
0 141
0 147
0 149
0 150

A todo esto, ¿qué ha estado sucediendo en la consola inicial, aquella donde habíamos puesto en marcha el servidor Malete? Luego del mensaje listening on '*:2042', apareció todo esto:

listening on '*:2042'
got 8 bytes
got tag -1
detected crlf
got 2 bytes
oStruct 'test.Q'
facMain 'test'
oDBo 'Q'
20 of 0 results off 0
got 8 bytes
got tag -1
detected crlf
got 2 bytes
oStruct 'test.Q'
oDBo 'Q'
20 of 0 results off 20
got 14 bytes
got tag -1
detected crlf
got 2 bytes
oStruct 'test.Q water'
oDBo 'Q water'
parsing 'water' as search
pos 0 lev 1: w
c0 = "water"/0
successfully parsed 5 bytes cost 1
creating 17
keypos 0027
keypos 8010
scb '2f162c1b2a' 15
got 15
20 of 14 results off 0
got 21 bytes
got tag -1
detected crlf
got 2 bytes
oStruct 'test.Q plant water?'
oDBo 'Q plant water?'
parsing 'plant water?' as search
pos 0 lev 1: p
pos 6 lev 1: w
* on lev 1
pos 6 lev 2: w
pos 11 lev 2: ?
c0 *
c0 = "plant"/0
m0 = "water"/0
successfully parsed 11 bytes cost 1
creating 4
creating 17
table 2 check 97 108-108 off 1308 35
keypos 001b
keypos 8006
scb '282216252c' 8
got 8
marking 17 + on 4
keypos 0027
keypos 8010
scb '2f162c1b2a' 15
matching res len 15 against flt len 8 cnd 4 set 1 mrk 1 dim 0
marking
marking
marked 2
reducing a->len 8
1st 0 were good
... to a->len 2
parsing '' as filter
c0 null
successfully parsed 0 bytes cost 0
20 of 2 results off 0
got 21 bytes
got tag -1
detected crlf
got 2 bytes
oStruct 'test.Q plant + dev$'
oDBo 'Q plant + dev$'
parsing 'plant + dev$' as search
pos 0 lev 1: p
pos 6 lev 1: +
+ on lev 1
pos 8 lev 2: d
c0 +
c0 = "plant"/0
c0 % "dev"/0
successfully parsed 12 bytes cost 1
creating 2
creating 17
table 2 check 97 108-108 off 1308 35
keypos 001b
keypos 8006
scb '282216252c' 8
got 8
creating 18
keypos 0009
keypos 000a
scb '1a1b2e1b2227281b1a0218272d252c2a1f1b2b' 1
scb '1a1b2e1b2227281f251d' 4
matching res len 4 against flt len 1 cnd 4 set 0 mrk 0 dim 0
merging 1+4 dim 0
copying 3 bs to 3 slots
merged 1+4 brk 0 untouched 4 b 3
scb '1a1b2e1b2227281f251d0218272d252c2a1f1b2b' 8
matching res len 8 against flt len 5 cnd 4 set 0 mrk 0 dim 0
merging 5+5 dim 0
copying 5 bs to 5 slots
merged 5+5 brk 0 untouched 6 b 5
scb '1a1b2e1b222728241b252c' 9
matching res len 9 against flt len 10 cnd 4 set 0 mrk 0 dim 0
merging 10+6 dim 0
merged 10+6 brk 0 untouched 1 b 0
scb '1a1b2e1b222728241b252c0228221625251f251d' 2
matching res len 2 against flt len 16 cnd 4 set 0 mrk 0 dim 0
merging 16+2 dim 0
merged 16+2 brk 0 untouched 5 b 0
scb '1a1b2e1b222728241b252c022b2c2a162c1b1d1f1b2b' 2
matching res len 2 against flt len 18 cnd 4 set 0 mrk 0 dim 0
merging 18+1 dim 0
copying 1 bs to 1 slots
merged 18+1 brk 0 untouched 2 b 1
scb '1a1b2e1b222728281b241b252c' 1
matching res len 1 against flt len 19 cnd 4 set 0 mrk 0 dim 0
merging 19+1 dim 0
merged 19+1 brk 0 untouched 7 b 0
loop ends on key '1a1b2f'(3) -1 3
got 20
matching res len 20 against flt len 8 cnd 4 set 0 mrk 0 dim 0
merging 8+20 dim 0
merged 8+20 brk 0 untouched 8 b 0
got 28
20 of 26 results off 0
got 8 bytes
got tag -1
detected crlf
got 2 bytes
oStruct 'test.Q'
oDBo 'Q'
20 of 26 results off 20

OK. So what?

Si reiteramos el mensaje “test.Q”, ahora que ya hemos agotado los resultados para la última consulta, obtenemos:

test.Q
# 0 3 0

Repetimos la consulta “plant water”, esta vez sin el signo de interrogación final:

test.Q plant water
# 2 4 0
0 5
0 25

(en lugar de obtener los 2 registros, como antes, ahora sólo vemos la lista de identificadores).

Hagamos entonces un repaso de lo visto hasta aquí.

Hemos estado usando un único tipo de mensaje: Q (query message, mensaje de consulta). La forma de este mensaje (para nuestra base test) es:

test.Q[*TAB*query]
test.Q
test.Q	query

query es una expresión en el lenguaje de consulta de Malete (ver Query.txt).

La fila de números que encabeza la respuesta a un mensaje Q tiene el significado siguiente (ver Protocol.txt):

número estimado de registros restantes, incluyendo los que acaban de ser leídos

número de la consulta, por el cual se la puede referenciar

truncation record id

Pasemos ahora a la prueba con PHP.

Para esto, copiamos el directorio 'php' a /var/www/html/openisis/ (/var/www/html es el DocumentRoot de nuestro servidor Apache). Nos aseguramos de que Apache está funcionando, e ingresamos con un navegador a

http://127.0.0.1/openisis/php/demo.php

(el servidor Malete ha seguido funcionando ininterrumpidamente).

La página que vemos consta de dos partes: la primera muestra el resultado de diversas manipulaciones sobre registros “virtuales” creados dentro del mismo script php; la segunda (a partir de “server”) muestra la interacción con el servidor Malete, usando los mensajes terms (T), query (Q), read (R), write (W) e index (X) sobre registros de la base test.

ATENCION: en Protocol.txt dice “The standard messages a database should recognize are”, y allí no se menciona 'terms'!

Luego de acceder a esa página, vemos que los archivos test.mrd y test.mqd han sido modificados. El primero, a causa de las operaciones de escritura sobre el registro 42; el segundo a causa de la operación de indización sobre el mismo registro 42.

ATENCION: para poder hacer esta comparación, deberíamos haber conservado una copia de test.mrd en su estado inicial. Si examinamos el contenido de test.mrd, notaremos que se han agregado dos registros al final. El primero, comienza con el encabezado:

W	42@13953

El segundo, es una copia del primero, pero sin el encabezado. Esto corresponde a lo que vemos en la página como “writing 42” y “writing 42 as new record”. Cuando se crea un nuevo registro (con el mismo contenido del registro 42), el registro creado recibe el identificador 152.

PREGUNTA: ¿quién es el usuario con permiso de escritura sobre esos archivos? Por lo que se ve, es el usuario que ha ejecutado el servidor Malete.

Volvemos por un momento a la consola donde tenemos nuestra sesión de telnet:

test.Q	one .. author
# 1 8 0
0 152

El número de consulta ha pasado a 8 -- los números 5, 6, 7 corresponden a las tres consultas realizadas desde demo.php. (Según Protocol.txt, “These numbers are per database”.)

[No sé por dónde continuar el análisis de demo.php.]

Algunas preguntas:

cómo sabe el servidor malete que deseamos trabajar con la base test/test?

La respuesta parece estar en Makefile:

server: $(MALETE) testdb

$(RUN) $(MALETE) server -vd -S test -f../test/

entonces, ¿cómo hacemos para activar el servidor y poder acceder a más de una base?

Respuesta: no lo sé.

por qué no anda “test.Q #n” ?

Cómo importar una base CDS/ISIS

Paso 1: copio los 8 archivos de la base biblio (mst, xrf, cnt, ifp, l01, l02, n01, n02) en el directorio test.

Paso 2: ejecuto malete con la opción cdsimp:

[fernando@localhost openisis]$ bin/malete cdsimp -No850 biblio -ftest/
mrx too short
rec 14 pos 109348 locked
rec 16 pos 107120 locked
rec 17 pos 103668 locked
rec 18 pos 101952 locked
rec 19 pos 104716 locked
rec 21 pos 110112 locked
rec 22 pos 113100 locked
rec 23 pos 102766 locked

Malete crea los cuatro archivos biblio.mrx, biblio.mrd, biblio.mqx, biblio.mqd.

ATENCION: La opción -No850 se omite cuando la base original tiene la codificación de MS-DOS.

Y ahora quiero poder consultar la base biblio mediante malete. ¿Qué hago?

En el directorio mlt hay un archivo ejecutable, 'run'.

[fernando@localhost openisis]$ cd mlt
[fernando@localhost mlt]$ ./run
loading cds index ...
using path ../test/cds
reading 435 bytes options from '../test/cds.m0d'
[...líneas omitidas...]
listening on '*:2042'

La base disponible ahora es cds. Probamos el mensaje T (terms):

cds.T	ar	as
# 0
0 4 arab countries
0 3 arabes
0 2 architecture
0 4 area
0 3 areas
0 1 arid
0 1 armaments
0 1 arms control
0 1 arms sales
0 1 art books
0 1 art history
0 1 artistic creation
0 1 arts

Restringimos los términos al tag 24:

cds.T	ar	as	24
# 0
0 3 arabes
0 3 area
0 3 areas
0 1 arid
0 1 armaments

ATENCION: esto parece ser un error:

cds.T	area	areas
# 0

Es decir, no devuelve ningún término, pero de acuerdo con Protocol.txt, 'T*TAB*from*TAB*to' Selects terms greater or equal the first parameter and less than the second. (BTW, debiera decir “greater or equal than”.)

El término 'area' es mayor o igual que 'area' y menor que 'areas', por lo tanto debiera aparecer como resultado.

La misma prueba, con otros pares de términos consecutivos, da el resultado correcto. Otros fracasos: west/western, model/models, press/pressure

Ubicar otro archivo donde tenía ya algunas notas sobre Malete 1.0.2 (mail?)

Es posible evitar la sesión de Telnet, usando por ejemplo:

bin/malete server cds -ftest/
bin/malete server biblio -ftest/

Este comando permite “activar” más de una base:

bin/malete server biblio -ftest/ cds -ftest/ test -ftest/

PREGUNTA: ¿por qué los terms en biblio están en mayúsculas, y los de cds y test en minúsculas? Encima... T y Q son sensibles a esta diferencia! Curiosamente, los términos en cds.mqt (que es de donde son tomados para crear test.mqd) están en mayúsculas.

Prueba con el script unicode.php

Ejecutamos el servidor:

bin/malete server -S unicode -ftest/

Genera los archivos unicode.mrx, unicode.mqd, unicode.mqx, unicode-demo.mcx.

En el archivo /var/www/html/openisis/php/unicode.php tenemos que hacer esta modificación (en forms y links):

/php/unicode => unicode.php

Este script permite:

a) ingresar datos en la base unicode, usando el formulario superior

(ciudad, país, río).

b) realizar búsquedas en la base, usando el formulario inferior, y ver un listado

de todos los registros y de todos los términos del índice.

Inicialmente, la lista de búsquedas está vacía (lo cual es natural), pero también está vacía la lista de términos... lo cual es extraño, pues el diccionario no está vacío!

Comenzamos con una búsqueda: wien -> no produce nada

Bien, entonces probemos generando (cargando) el unicode.mqd “a mano”:

bin/malete qload -vi unicode -ftest/ <test/unicode.mqt

OK, con eso se resuelve el problema. Entramos a

http://127.0.0.1/openisis/php/unicode.php?bitte=terms

y nos muestra 40 términos del diccionario. Y cada término es un link que funciona! No entiendo por qué “Zürich” aparece en el índice como “zuerich”, “Köln” como “koeln”, “Österreich” como “oesterreich”.

Si buscamos “zürich” o “zuerich” recuperamos el registro 4, correspondiente a Zürich.

Si buscamos “Lódz”, recupera el registro 9.

Si accedemos a

http://127.0.0.1/openisis/php/unicode.php?bitte=suchen

vemos un listado de los registros presentes en la base (inicialmente 14).

Ahora ingresamos un nuevo registro en la base de datos:

Ciudad Juárez / México

Así hemos creado el registro 15. Pero ya encontramos un nuevo problema: en lugar de los dos términos (juárez, méxico) que esperábamos encontrar en el diccionario, aparecen estos cuatro: ju, rez, m, xico.

Sin embargo, si creamos un registro con la palabra “Córdoba”, el término “cordoba” aparece en el diccionario.

Esto se explica si estudiamos el archivo unicode.m0d, que contiene una línea

4	M	o	ó

(esto es, la “ó” es mapeada a la “o”), pero nada dice acerca de otras vocales como “á” o “é”.

Si modificamos el archivo .m0d, debemos volver a cargar el índice (qdump + qload).

Importación de registros ISO/MARC

Tomamos un registro MARC (mr.mrc), al que renombramos como mr.iif, y lo ubicamos en el directorio test. Ejecutamos:

bin/malete iifimp mr -ftest/

y vemos que se generan los 4 archivos mr.m[rq][dx]. Examinamos mr.mrd y encontramos allí el registro MARC tal como esperábamos, y además tenemos un primer campo donde se almacenan los 8 bytes “importantes” del leader:

Leader original: 02688cas 2200589 a 4500

Leader en mr.mrd:

W	1	cas a

(esto es: c a s blank blank blank a blank, que corresponde a las posiciones 05, 06, 07, 08, 09, 17, 18, 19)

No es necesario que el archivo marc tenga la extensión .iif:

bin/malete iifimp -Ftest/mr.mrc mr -ftest/

Debe notarse que esto produce una importación (o append) sobre la base mr.

Probamos ahora con un archivo que contiene 50 registros MARC:

bin/malete iifimp -Ftest/bahia-1-50.mrc bahia -ftest/

ATENCION: en estas pruebas estamos usando registros MARC de LC (codificación: Latin1). Aun así, ya detectamos un problema:

255	aScale 1:500,000	c(W 64°30Ž--W 55°30Ž/S 32°00Ž--S 42°00Ž).

(Habrá que verificar el registro original.)

Probamos ahora con algunos (855) registros de OCLC:

bin/malete iifimp -Ftest/oclc.mrc oclc -ftest/

Y allí aparece el problema de la codificación: “Problemas de geometrâia analâitica”

Pruebas con bases que no existen

El envío de un mensaje a una base que no existe provoca que la base sea creada. Pero si desde otra consola borramos la base, entonces al siguiente mensaje que enviemos la base no será recreada.

Otro ejemplo: entro a demo.php, que intenta acceder a la base test; como la base no existe, la crea; pero luego corrijo la situación borrando los archivos creados y reemplazándolos por links simbólicos a la base test. Vuelvo a entrar a demo.php, pero sigue viendo la base vacía que creó un rato antes! Recién luego de reiniciar el servidor malete se corrige la situación.

malete dbinfo xxx -> crea la base xxx

Plan para un tutorial básico de Malete

creo que conviene comenzar por los archivos que componen una base

aclarar que vamos a “dialogar” a bajo nivel con el servidor malete, para aprender cómo funciona el protocolo. Hacer una analogía con HTTP (telnet host 80). En la práctica, ese diálogo estará a cargo de las aplicaciones que usemos/desarrollemos (e.g. Isis.php).

una sesión sencilla con la base test: mensajes R, Q, T

estudio del mensaje R

estudio del mensaje T

estudio del mensaje Q. Sintaxis de las consultas

estudio del mensaje W

estudio del mensaje X

el archivo .mrd. El concepto de screenshot

el archivo .m0d. Metadata. Collation

otras opciones aparte del server:

cdsimp

cdsexp

iifimp - importación de MARC, importación de ISO (isis), leader

iifexp

dbinfo

qdump

qload

rdump

rload

trabajo con bases múltiples; links simbólicos

registros incrustados (embedded) ?

permisos sobre las bases?

principales diferencias con cds/isis: términos largos en el diccionario; reemplazo de isisuc.tab & isisac.tab por .m0d; FST?; archivos que componen una base de datos; lenguaje de búsquedas.

capacidades, limitaciones (tamaños de registros, archivos, claves,...)

recodificación (Cp850, iso-8859-1, utf-8,...)

case sensitivity of terms/queries...?

interacción via web: demo.php (crear demos más detallados)

para investigar: cómo tener herramientas de línea de comando que proporcionen funcionalidad similar a la de los cisis?

i2id, id2i: no es necesaria (ver mrd)

mx: gizmo, iso, seq, dict

msrt

retag

etc

compatibilidad entre plataformas: bases “dos” y bases “linux”.

ATENCION ATENCION [WINDOWS] el servidor no escribe los cambios en la base en forma inmediata. Hago una prueba de escritura desde PHP, y veo que el mrd no se modifica. A continuación bajo el servidor (CTRL+C), y entonces sí aparece el cambio. Pero si necesito trabajar con el archivo mrd (e.g. para hacer un backup), cómo logro que esté al día, sin bajar el servidor?

Dudas y correcciones para Klaus

Descripción de archivos en el directorio mlt:

db.c	implementation of general db access functions
rdx.c	implementation of general db access functions

¿Por qué los archivos .mcx se generan en el directorio desde el que se ejecuta el comando malete? Por ejemplo, al ejecutar

bin/malete server -S unicode -ftest/

se genera unicode-demo.mcx en el directorio actual. ¿No debiera ir también al directorio test? En CharSet.txt dice que se graba en el directorio actual.

Archivo IIF.txt, hablando de generar IIF desde WinIsis: “Make sure, that every field starts with two indicator characters” debiera excluir a los campos 00x.

Importación de registros MARC con la codificación MARC-8 (e.g., de OCLC).

Alguna idea acerca de CQL (Common Query Language)?

Alguna posibilidad de implementar una función de proximidad tipo agrep?

CharSet.txt

multibyte entitities => multibyte entities

completey => completely

are mapped to first one => are mapped to the first one

sideeffect => side effect ?

beginn => begin

c.f. => cf.

with it's own tertiary => with its own tertiary

it's secondary variant => its secondary variant

it's lowercase equivalent => its lowercase equivalent

Since Malete support full application controlled indexing => supports

is the name yo your database => is the name of your database

MetaData.txt

as detailled => as detailed

demo.php

</br> => <br>

CH y LL en español (collation)

Si modifico el archivo m0d (tabla de collation), ¿qué debo hacer para generar el mcx correspondiente? ¿Borrar el viejo y reiniciar el servidor?

Si tengo el servidor andando con una base, y quiero acceder a una segunda base, ¿debo reiniciar el servidor? ¿Inicio otro en otro puerto?

No comprendo la diferencia entre A (alias) y M (mapeo) en el archivo m0d, para el caso de las vocales acentuadas. En el ejemplo del CharSet.txt, “A”,“á” y “Á” aparecen como alias de “a”, y “E”, “é”, “É” aparecen como alias de “e”. Pero en unicode.m0d, la “ó” aparece *mapeada* a la “o”.

Klaus: en el menú lateral del sitio web faltan links a algunos documentos.

Pruebas con Malete 1.0.2 - Domingo 15 de mayo 2005

Para que el servidor funcione en Windows:

malete server -S
malete server -S2042

Demo:

http://localhost/openisis/php/demo.php

Para poder hacer búsquedas, es necesario crear antes el diccionario para la base test/cds:

..\malete qload cds <cds.mqt

Y en demo.php:

$db = new Isis_Db($fdt, 'test/cds', new Isis_Server());

El archivo Converting.txt dice:

Create a textual representation of the index by
$
malete qdump cds 2>cds.mqt
$

El comando debiera ser: malete qdump cds >cds.mqt

Importación de una base tradicional:

>malete cdsimp biblio

Info sobre la base:

>malete dbinfo biblio
db biblio path biblio has 205 records
mrx type 0x01: 4 pos + 3 len + 1 fields = 8 bytes
mqd type 0x01: blocksize 1024, 8 byte pointer values, 247 byte uncompressed keys
mqd pointers 0x8b: 3 record id + 2 tag + 3 pos bytes tag first

Genera versión txt de la base:

>malete rdump biblio > biblio.txt

Genera versión txt del diccionario:

>malete qdump biblio >biblio.mqt

Importación de un archivo .iso

>malete iifimp test1 (busca un archivo test1.iif)

ATENCION: los subcampos aparecen delimitados con '^', y no con TAB.

Probamos detalladamente con G:\httpd\bases\cds, para poder reportar problemas.

malete cdsimp g:\httpd\bases\cds\cds

Genera error:

could not truncate 0: La operaci¾n solicitada no se puede realizar en un archivo
con una secci¾n asignada a usuario abierta.

Crea 4 archivos: cds.m[rq][dx] cds.mrd es el único en “formato texto”. En cds.mrd se observan estos cambios:

delimitador de subcampos: ^ -> TAB

codificación: Cp850 -> Latin 1

Sólo aparecen los campos, sin ningún metadato. ATENCION: cds.mrd contiene el texto “W 24” antes del registro 24, y solamente allí sucede ese fenómeno.

¿Es necesario que exista un archivo invertido para la base de origen?

Versión txt del diccionario:

G:\tmp\malete>malete qdump cds >cds.mqt
mrx older than data <--- ERROR?

Genera cds.mqt, y escribe cds.mrx

Dump del archivo maestro:

G:\tmp\malete>malete rdump cds >cds.dump

cds.dump comienza con “W 1@0”. Sigue con:

"W	2@336"
"W	3@624"
...
"W	151@57504"

Fuera de eso, es igual a cds.mrd. Delimitador de subcampos: TAB

Exportación IIF (ISO):

G:\tmp\malete>malete iifexp cds

Genera cds.iif, un archivo iso2709 (sin saltos de línea)

cds.m0d (collation) para español, está desactualizado (ch, ll)

From CharSet.txt: “Creating a collation definition from existing ISISAC.TAB and ISISUC.TAB is a straightforward exercise left to the reader.”