User Tools

Site Tools


update-opac.sh

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
update-opac.sh [15/11/2006 13:31]
fernando Versión: 2006.11.13
update-opac.sh [20/07/2007 16:44]
fernando título
Line 1: Line 1:
 +====== Script update-opac.sh ======
  
 +Este es el script utilizado para generar la actualización del OPAC. Versión: 2006.11.13.
 +
 +
 +<code bash>
 +#!/bin/bash
 +
 +# -----------------------------------------------------------------------
 +# update-opac.sh
 +#
 +# Este script genera el conjunto de bases de datos y archivos
 +# auxiliares utilizados en el OPAC.
 +#
 +# Argumentos:
 +#            $1 nombre de la base
 +#            $2 cantidad de registros a procesar (opcional, es útil para
 +#               ​procesar una cantidad pequeña de registros de una base
 +#               ​grande cuando se hacen pruebas)
 +#
 +# Ejemplos:
 +#         ​update-opac demo
 +#         ​update-opac mibase 500
 +#
 +#
 +# (c) 2003-2006 Fernando J. Gomez - CONICET - INMABB
 +#
 +# -----------------------------------------------------------------------
 +#
 +# Requiere algunos utilitarios CISIS: mx, msrt, i2id, id2i; para convertir
 +# las bases al "​formato Windows"​ necesita además crunchmf y crunchif.
 +#
 +# La base de origen debe tener la codificación "​ANSI"​ (aka windows-1252,​
 +# aka latin-1). Las bases creadas con Catalis ya traen esa codificación;​
 +# bases provenientes de Windows o DOS pueden requerir la conversión,​ por
 +# ejemplo mediante el gizmo oem2ansi.
 +#
 +# Este script por ahora debe permanecer codificado como latin-1. Si usamos
 +# utf-8 tenemos un error de mx al usar el carácter '​¦'​ como delimitador
 +# en los proc.
 +#
 +# Usamos "​seq=filename.id\n"​ para que mx use el carácter de fin de línea como
 +# delimitador de campos (y, en consecuencia,​ no se produzca una indeseada
 +# separacion en campos).
 +# ¿Hay alguna manera de evitar que mx asuma un separador de campos?
 +#
 +# ATENCION: en caso de registros corruptos, es posible que recién
 +# salte un error al usar id2i para recrear la base biblio.
 +#
 +# Este script fue originalmente escrito como un .bat para Windows,
 +# y aún conserva vestigios de ese pasado, a la espera de completar
 +# la traducción.
 +#
 +# -----------------------------------------------------------------------
 +#
 +# Esta es la estructura del script:
 +#
 +# * configuración
 +
 +# * verificar argumentos recibidos, existencia de bases
 +
 +# * descomprimir archivo .zip con la base
 +
 +# * si tenemos imagenes de tapas, añadimos un campo con esa info
 +
 +# * si tenemos registros de SeCS, los añadimos a la base
 +
 +# * procesamiento de las bases:
 +# BIBLIO_DATABASE_1
 +# SUBJ_DATABASE
 +# NAME_DATABASE
 +# TITLE_DATABASE
 +# BIBLIO_DATABASE_2
 +# FULLINV
 +# POSTINGS
 +# AGREP_DICTIONARIES
 +# ARCHIVOS_AUXILIARES
 +#
 +# * limpieza (borrado de temporales) (opcional)
 +
 +# * movemos los archivos generados al directorio destino (opcional)
 +#
 +# -----------------------------------------------------------------------
 +#
 +# TO-DO:
 +#
 +# Aceptar como input otras opciones además de un archivo .zip:
 +# archivos biblio.mst + biblio.xrf, archivo .iso, archivo .id, archivo .mrc
 +#
 +# Medir el tiempo de ejecucion del script, y revisar de manera general
 +# su diseño, porque es lento en máquinas viejas con bases grandes.
 +#
 +# ¿Qué hacemos si los registros ya vienen con ^9 en los
 +# campos de encabezamientos?​
 +#
 +# =========================================================================
 +
 +# Funciones de error tomadas de install_qemu.sh (ver http://​ubuntuforums.org/​showthread.php?​t=187413)
 +
 +## COLOR ECHO FUNCTION ##
 +cecho()
 +{
 + if [ "​$1"​ = "​black"​ ]; then
 + echo -ne "​\E[30m"​
 + elif [ "​$1"​ = "​red"​ ]; then
 + echo -ne "​\E[31m"​
 + elif [ "​$1"​ = "​green"​ ]; then
 + echo -ne "​\E[32m"​
 + elif [ "​$1"​ = "​yellow"​ ]; then
 + echo -ne "​\E[33m"​
 + elif [ "​$1"​ = "​blue"​ ]; then
 + echo -ne "​\E[34m"​
 + elif [ "​$1"​ = "​magenta"​ ]; then
 + echo -ne "​\E[35m"​
 + elif [ "​$1"​ = "​cyan"​ ]; then
 + echo -ne "​\E[36m"​
 + fi
 +
 + echo "​$2"​ "​$3"​
 + tput sgr0
 +}
 +
 +## ERROR FUNCTION ##
 +error()
 +{
 + if [ "​$1"​ = ""​ ]; then
 + cecho "​red"​ "​ERROR:​ hubo una falla, con causa desconocida."​
 + else
 + cecho "​red"​ "​ERROR:​ $1"
 + fi
 + exit
 +}
 +
 +
 +echo
 +cecho "​blue"​ "​-----------------------------------------------------"​
 +cecho "​blue"​ " ​ update-opac.sh - SCRIPT DE ACTUALIZACION DEL OPAC  "
 +cecho "​blue"​ "​-----------------------------------------------------"​
 +
 +# ------------------------------------------------------------------
 +# VERIFICAMOS PRESENCIA DEL PARAMETRO OBLIGATORIO
 +# ------------------------------------------------------------------
 +if [ "​$1"​ = ""​ ]; then
 + error "Debe indicar el nombre de la base."
 +fi
 +
 +DB_NAME=$1
 +
 +
 +# ------------------------------------------------------------------
 +# LEEMOS CONFIGURACION
 +# ------------------------------------------------------------------
 +
 +CONF_FILE=`dirname $0`/​../​conf.sh
 +. $CONF_FILE || error "No se ha encontrado el archivo de configuración $CONF_FILE"​
 +
 +
 +# ------------------------------------------------------------------
 +# DEFINIMOS ALGUNAS VARIABLES
 +# ------------------------------------------------------------------
 +
 +# Directorio de trabajo
 +WORK_DIR=$OPACMARC_DIR/​work/​$DB_NAME
 +if [ ! -d $WORK_DIR ]; then
 + error "No se ha encontrado el directorio de trabajo: $WORK_DIR"​
 +fi
 +
 +# En este directorio se encuentra la base original ​
 +SOURCE_DIR=$WORK_DIR/​original
 +
 +# Hay que usar el path *absoluto* para el cipar
 +export CIPAR=$OPACMARC_DIR/​opac/​opac.cip
 +
 +
 +# ------------------------------------------------------------------
 +# GENERAMOS EL ARCHIVO CIPAR
 +# ------------------------------------------------------------------
 +
 +# Usamos % como delimitador debido a que $OPACMARC_DIR contiene barras (/) 
 +sed "​s%__OPACMARC_DIR__%$OPACMARC_DIR%"​ $CIPAR.dist > $CIPAR || error "No se pudo generar el archivo cipar"
 +
 +
 +# ------------------------------------------------------------------
 +
 +
 +# Nos ubicamos en el directorio de trabajo
 +cd $WORK_DIR || error "No se puede ingresar al directorio de trabajo, $WORK_DIR"​
 +
 +# Creamos el directorio temporal, si es necesario
 +if [ ! -d tmp ]; then
 +    mkdir tmp || error "No se pudo crear el directorio tmp"
 +    #cecho "​blue"​ "​Directorio tmp creado."​
 +fi
 +
 +
 +# La base de datos original puede estar en diversos formatos:
 +#     ​ZIP: ​    ​dbname.zip o biblio.zip (contiene biblio.mst y biblio.xrf)
 +#     ​TGZ: ​    ​dbname.tgz o dbname.tar.gz [PENDIENTE]
 +#     ​MST/​XRF:​ biblio.mst y biblio.xrf
 +#     ​MRC: ​    ​dbname.mrc
 +#     ​ISO: ​    ​dbname.iso o biblio.iso
 +#     ​ID: ​     dbname.id o biblio.id
 +echo
 +if [ -f $SOURCE_DIR/​$DB_NAME.zip ]; then
 + unzip -oq $SOURCE_DIR/​$DB_NAME.zip -d tmp || error
 + cecho "​blue"​ "​Usando como base original: $SOURCE_DIR/​$DB_NAME.zip"​
 +
 +elif [ -f $SOURCE_DIR/​biblio.zip ]; then
 + unzip -oq $SOURCE_DIR/​biblio.zip -d tmp || error
 + cecho "​blue"​ "​Usando como base original: $SOURCE_DIR/​biblio.zip"​
 +
 +elif [[ -f $SOURCE_DIR/​biblio.mst && -f $SOURCE_DIR/​biblio.xrf ]]; then
 + cp -f $SOURCE_DIR/​biblio.{mst,​xrf} tmp/ || error
 + cecho "​blue"​ "​Usando como base original: $SOURCE_DIR/​biblio.{mst,​xrf}"​
 +
 +elif [ -f $SOURCE_DIR/​$DB_NAME.mrc ]; then
 + echo
 + cecho "​blue"​ "​Importando archivo $SOURCE_DIR/​$DB_NAME.mrc..."​
 + php $OPACMARC_DIR/​bin/​mrc2isis.php $SOURCE_DIR/​$DB_NAME.mrc > tmp/​$DB_NAME.id || error "Falla al ejecutar mrc2isis.php"​
 + id2i tmp/​$DB_NAME.id create=tmp/​biblio || error "Hubo una falla al ejecutar id2i"
 +
 +elif [ -f $SOURCE_DIR/​$DB_NAME.iso ]; then
 + mx iso=$SOURCE_DIR/​$DB_NAME.iso create=tmp/​biblio now -all || error
 + cecho "​blue"​ "​Usando como base original: $SOURCE_DIR/​$DB_NAME.iso"​
 +
 +elif [ -f $SOURCE_DIR/​biblio.iso ]; then
 + mx iso=$SOURCE_DIR/​biblio.iso create=tmp/​biblio now -all || error
 + cecho "​blue"​ "​Usando como base original: $SOURCE_DIR/​biblio.iso"​
 +
 +elif [ -f $SOURCE_DIR/​$DB_NAME.id ]; then
 + id2i $SOURCE_DIR/​$DB_NAME.id create=tmp/​biblio || error
 + cecho "​blue"​ "​Usando como base original: $SOURCE_DIR/​$DB_NAME.id"​
 +
 +elif [ -f $SOURCE_DIR/​biblio.id ]; then
 + id2i $SOURCE_DIR/​biblio.id create=tmp/​biblio || error
 + cecho "​blue"​ "​Usando como base original: $SOURCE_DIR/​biblio.id"​
 +
 +else
 + error "No se encuentra la base de datos original"​
 +fi
 +
 +
 +# El 2do parametro (opcional) indica cuántos registros procesar
 +if [ ! -z $2 ]; then
 +    MAXCOUNT=$2
 +else
 +    MAXCOUNT=999999
 +fi
 +
 +mx tmp/biblio count=$MAXCOUNT create=tmp/​bibliotmp now -all || error "Hubo una falla al ejecutar mx"
 +mv -f tmp/​bibliotmp.mst tmp/​biblio.mst || error
 +mv -f tmp/​bibliotmp.xrf tmp/​biblio.xrf || error
 +
 +
 +# ------------------------------------------------------------------
 +# Para la base bibima, tenemos que añadir a la base biblio los registros del SeCS
 +# Como input necesitamos:​
 +#     * base secstitle (la base title de SeCS, en formato linux)
 +#     * archivo EMA.001 (listado de existencias,​ generado desde SeCS)
 +#     * base oem2ansi (el gizmo para cambio de codificación)
 +#     * archivo secs2marc.proc (migración SeCS => MARC21)
 +# ------------------------------------------------------------------
 +if [ -f $SOURCE_DIR/​$DB_NAME-secstitle.zip ]; then    # testeamos si existe la base secstitle asociada
 + echo
 + cecho "​blue"​ "​Procesando base SECSTITLE..."​
 +
 + # TO-DO: usar mxcp para eliminar espacios en la base title
 +
 + # paso 0: descomprimimos la base
 + unzip -oq $SOURCE_DIR/​$DB_NAME-secstitle.zip -d tmp || error "No se pudo descomprimir el archivo $SOURCE_DIR/​$DB_NAME-secstitle.zip"​
 +
 + # paso 1: recodificamos caracteres
 + mx tmp/​secstitle gizmo=OEM2ANSI create=tmp/​title now -all || error "Hubo una falla al ejecutar mx"
 +
 + # paso 2: creamos una base de holdings
 + mx seq=tmp/​EMA.001 create=tmp/​holdings now -all || error "Hubo una falla al ejecutar mx"
 + mx tmp/​holdings "fst=2 0 v2" fullinv=tmp/​holdings || error "Hubo una falla al ejecutar mx"
 +
 + # paso 3: insertamos la información sobre holdings en los registros bibliográficos
 + mx tmp/title "​proc='​a98|',​ref(['​tmp/​holdings'​]l(['​tmp/​holdings'​]v40^c),​v3),'​|'"​ copy=tmp/​title now -all || error "Hubo una falla al ejecutar mx"
 +
 + # paso 4: migramos a MARC
 + mx tmp/title "​proc=@SECS2MARC.PROC"​ create=tmp/​title_marc now -all || error "Hubo una falla al ejecutar mx"
 +
 + # paso 5: añadimos los registros a la base biblio
 + mx tmp/​title_marc append=tmp/​biblio now -all || error "Hubo una falla al ejecutar mx"
 +fi
 +# ------------------------------------------------------------------
 +
 +
 +# Si hay imágenes de tapa, creamos un campo 985
 +if [ ! -d $DIR_IMG ]; then
 + echo
 + cecho "​blue"​ "No hay directorio de imagenes"​
 +else
 + echo
 + cecho "​blue"​ "​Procesando imágenes de tapas..."​
 + ls $DIR_IMG | grep '​00[0-9]\{4\}\.[a-z]\{3\}$'​ > tmp/​lista_img.txt # TO-DO: revisar esta expresión regular
 + mx seq=tmp/​lista_img.txt create=tmp/​lista_img now -all || error "Hubo una falla al ejecutar mx"
 + mx tmp/​lista_img "​proc='​d1a1#',​v1.6,'​^f',​v1*7.3,'#'"​ copy=tmp/​lista_img now -all || error "Hubo una falla al ejecutar mx"
 + mx tmp/​lista_img "fst=1 0 v1^*" fullinv=tmp/​lista_img || error "Hubo una falla al ejecutar mx"
 +
 + # Oct. 19, 2006
 + #ATENCION: tenemos un error en el MFN 4009 de bibima
 + # fatal: recupdat/​mfn
 + # en la base vemos:
 + #     ​004008 ​  ​10^aVariational calculus and optimal con..
 + #     ​925907264 ​  ​10^aDiscriminants,​ resultants, and multi..
 + #     ​004010 ​  ​00^aAnalysis on manifolds /^cJames R. Mu..x
 + # pero antes de ejecutar este comando el registro 4009 se ve sano.
 + # Oct. 20, 2006: el problema desaparece al recrear la base usando $MAXCOUNT
 +
 + # Quizás sea mejor hacer un loop sobre los archivos de imagenes y solo acceder a los registros afectados,
 + # en vez de acceder a todos los registros para solo modificar unos pocos
 + mx tmp/biblio "​proc=if l(['​tmp/​lista_img'​]v1) > 0 then '​d985a985!##​^a',​ref(['​tmp/​lista_img'​]l(['​tmp/​lista_img'​]v1),​v1^f),'​!'​ fi" copy=tmp/​biblio tell=$TELL now -all || error "Hubo una falla al ejecutar mx"
 +fi
 +
 +
 +# ------------------------------------------------------------------
 +# BASE BIBLIO (1ra pasada)
 +# ------------------------------------------------------------------
 +
 +echo
 +cecho "​blue"​ "​Creamos una copia (texto) de la base bibliografica..."​
 +i2id tmp/biblio tell=$TELL > tmp/​biblio1.id ​    # || error "Hubo una falla al ejecutar i2id"
 +# BUG en i2id: aun sin haber errores, el exit status es diferente de cero (e.g. 17, 19). Se testea con 'echo $?'
 +
 +echo
 +cecho "​blue"​ "​Intentamos normalizar la puntuacion final, filtramos encabezamientos"​
 +cecho "​blue"​ "​tematicos,​ y asignamos un numero (provisorio) a cada campo"
 +cecho "​blue"​ "de encabezamientos en el subcampo ^9..."
 +mx "​seq=tmp/​biblio1.id\n"​ lw=3000 "​pft=@HEAD.PFT"​ now tell=$TELL > tmp/​biblio2.id || error "Hubo una falla al ejecutar mx"
 +
 +
 +# ------------------------------------------------------------------
 +# BASE SUBJ
 +# ------------------------------------------------------------------
 +
 +echo
 +cecho "​blue"​ "​-----------------------------------------------------"​
 +cecho "​blue"​ " Base de encabezamientos tematicos"​
 +cecho "​blue"​ "​-----------------------------------------------------"​
 +
 +cecho "​blue"​ "​Creamos el listado de encabezamientos tematicos..."​
 +mx "​seq=tmp/​biblio2.id\n"​ lw=1000 "​pft=if getenv('​SUBJ_TAGS'​) : v1*1.4 then @SUBJ.PFT fi" now tell=$TELL > tmp/​subj1.id || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ "​Convertimos el listado en una base (desordenada y con duplicados)..."​
 +id2i tmp/​subj1.id create/​app=tmp/​subj1 tell=$TELL || error "Hubo una falla al ejecutar id2i"
 +
 +echo
 +cecho "​blue"​ "​Regularizamos la puntuacion final de los encabezamientos generados..."​
 +mx tmp/subj1 "​proc='​d2a2¦',​v1,'​¦'"​ "​proc='​d1a1¦',​@REGPUNT.PFT,'​¦'"​ "​proc='​d2'"​ copy=tmp/​subj1 now -all tell=$TELL || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ "​Almacenamos en un campo auxiliar la clave de ordenacion..."​
 +mx tmp/subj1 uctab=UC-ANSI.TAB "​proc='​d99a99¦',​@HEADSORT.PFT,'​¦'"​ copy=tmp/​subj1 now -all tell=$TELL || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ "​Ordenamos la base de encabezamientos tematicos..."​
 +msrt tmp/subj1 100 v99 tell=$TELL || error "Hubo una falla al ejecutar msrt"
 +
 +echo
 +cecho "​blue"​ "​Generamos la tabla para mapear los numeros de encabezamientos..."​
 +mx tmp/subj1 "​pft=if s(v1) <> ref(mfn-1,​v1) then putenv('​HEADING_CODE='​v9) fi, v9,'​|',​getenv('​HEADING_CODE'​)/"​ now -all tell=$TELL > tmp/​subjcode.seq || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ "​Eliminamos los encabezamientos duplicados..."​
 +mx tmp/subj1 lw=1000 "​pft=@ELIMDUP2.PFT"​ now tell=$TELL > tmp/subj.id || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ "​Creamos la base de encabezamientos tematicos (ordenada y sin duplicados)..."​
 +id2i tmp/subj.id create/​app=subj tell=$TELL || error "Hubo una falla al ejecutar id2i"
 +
 +
 +# ------------------------------------------------------------------
 +# BASE NAME
 +# ------------------------------------------------------------------
 +
 +echo
 +cecho "​blue"​ "​-----------------------------------------------------"​
 +cecho "​blue"​ " Base de encabezamientos de nombres"​
 +cecho "​blue"​ "​-----------------------------------------------------"​
 +
 +cecho "​blue"​ "​Creamos el listado de encabezamientos de nombres..."​
 +mx "​seq=tmp/​biblio2.id\n"​ lw=1000 "​pft=if getenv('​NAME_TAGS'​) : v1*1.4 then @NAME.PFT fi" now tell=$TELL > tmp/​name1.id || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ "​Convertimos el listado en una base (desordenada y con duplicados)..."​
 +id2i tmp/​name1.id create/​app=tmp/​name1 tell=$TELL || error "Hubo una falla al ejecutar id2i"
 +
 +echo
 +cecho "​blue"​ "​Regularizamos la puntuacion final de los encabezamientos generados..."​
 +mx tmp/name1 "​proc='​d2a2¦',​v1,'​¦'"​ "​proc='​d1a1¦',​@REGPUNT.PFT,'​¦'"​ "​proc='​d2'"​ copy=tmp/​name1 now -all tell=$TELL || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ "​Almacenamos en un campo auxiliar la clave de ordenacion..."​
 +mx tmp/name1 uctab=UC-ANSI.TAB "​proc='​d99a99¦',​@HEADSORT.PFT,'​¦'"​ copy=tmp/​name1 now -all tell=$TELL || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ "​Ordenamos la base de encabezamientos de nombres..."​
 +msrt tmp/name1 100 v99 tell=$TELL || error "Hubo una falla al ejecutar msrt"
 +
 +echo
 +cecho "​blue"​ "​Generamos la tabla para mapear los numeros de encabezamientos..."​
 +mx tmp/name1 "​pft=if s(v1) <> ref(mfn-1,​v1) then putenv('​HEADING_CODE='​v9) fi, v9,'​|',​getenv('​HEADING_CODE'​)/"​ now -all tell=$TELL > tmp/​namecode.seq || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ "​Eliminamos los encabezamientos duplicados..."​
 +mx tmp/name1 lw=1000 "​pft=@ELIMDUP2.PFT"​ now tell=$TELL > tmp/name.id || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ "​Creamos base de encabezamientos de nombres (ordenada y sin duplicados)..."​
 +id2i tmp/name.id create/​app=name tell=$TELL || error "Hubo una falla al ejecutar id2i"
 +
 +
 +echo
 +# -----------------------------------------------------------------
 +cecho "​blue"​ "​Reasignamos numeros a los encabezamientos en los registros"​
 +cecho "​blue"​ "​bibliograficos (subcampo 9)..."
 +# -----------------------------------------------------------------
 +mx seq=tmp/​subjcode.seq create=tmp/​subjcode now -all || error "Hubo una falla al ejecutar mx"
 +mx tmp/​subjcode "fst=1 0 v1" fullinv=tmp/​subjcode || error "Hubo una falla al ejecutar mx"
 +mx seq=tmp/​namecode.seq create=tmp/​namecode now -all || error "Hubo una falla al ejecutar mx"
 +mx tmp/​namecode "fst=1 0 v1" fullinv=tmp/​namecode || error "Hubo una falla al ejecutar mx"
 +
 +mx "​seq=tmp/​biblio2.id\n"​ lw=1000 "​pft=@RECODE.PFT"​ now tell=$TELL > tmp/​biblio3.id || error "Hubo una falla al ejecutar mx"
 +
 +
 +# ------------------------------------------------------------------
 +# BASE TITLE
 +# ------------------------------------------------------------------
 +
 +echo
 +cecho "​blue"​ "​-----------------------------------------------------"​
 +cecho "​blue"​ " Base de titulos"​
 +cecho "​blue"​ "​-----------------------------------------------------"​
 +
 +cecho "​blue"​ "​Creamos listado de titulos..."​
 +mx "​seq=tmp/​biblio3.id\n"​ lw=1000 "​pft=if getenv('​TITLE_TAGS'​) : v1*1.4 then ,​@TITLE.PFT,​ fi" now tell=$TELL > tmp/​title1.id || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ "​Convertimos el listado en una base (desordenada y con duplicados)..."​
 +id2i tmp/​title1.id create/​app=tmp/​title1 tell=$TELL || error "Hubo una falla al ejecutar id2i"
 +
 +echo
 +cecho "​blue"​ "​Almacenamos en un campo auxiliar (99) la clave de ordenacion de titulos."​
 +mx tmp/title1 uctab=UC-ANSI.TAB "​proc='​d99a99¦',​@HEADSORT.PFT,'​¦'"​ copy=tmp/​title1 now -all tell=$TELL || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ "​Ordenamos la base de titulos."​
 +msrt tmp/title1 100 v99 tell=$TELL || error "Hubo una falla al ejecutar msrt"
 +
 +echo
 +cecho "​blue"​ "​Eliminamos los titulos duplicados."​
 +mx tmp/title1 lw=1000 "​pft=@ELIMDUP2.PFT"​ now tell=$TELL > tmp/​title.id || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ "​Creamos la base de titulos (ordenada y sin duplicados)."​
 +id2i tmp/​title.id create/​app=title tell=$TELL || error "Hubo una falla al ejecutar id2i"
 +
 +
 +# ------------------------------------------------------------------
 +# BASE BIBLIO (2da pasada)
 +# ------------------------------------------------------------------
 +
 +echo
 +cecho "​blue"​ "​-----------------------------------------------------"​
 +cecho "​blue"​ "Base bibliografica"​
 +cecho "​blue"​ "​-----------------------------------------------------"​
 +
 +cecho "​blue"​ "​Recreamos la base bibliografica."​
 +id2i tmp/​biblio3.id create=biblio tell=$TELL || error "Hubo una falla al ejecutar id2i"
 +
 +echo
 +cecho "​blue"​ "​Ordenamos la base bibliografica."​
 +msrt biblio 100 @LOCATION_SORT.PFT tell=$TELL || error "Hubo una falla al ejecutar msrt"
 +
 +
 +# ------------------------------------------------------------------
 +# FULLINV
 +# ------------------------------------------------------------------
 +
 +# -------------------------------------------------------------------
 +# Generacion de archivos invertidos.
 +# ATENCION: AC-ANSI.TAB envia los numeros al diccionario.
 +# -------------------------------------------------------------------
 +
 +echo
 +cecho "​blue"​ " Archivo invertido - Base de temas..."​
 +mx subj fst=@HEADINGS.FST actab=AC-ANSI.TAB uctab=UC-ANSI.TAB fullinv=subj tell=$TELL || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ " Archivo invertido - Base de nombres..."​
 +mx name fst=@HEADINGS.FST actab=AC-ANSI.TAB uctab=UC-ANSI.TAB fullinv=name tell=$TELL || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ " Archivo invertido - Base de titulos..."​
 +mx title "fst=2 0 '​~',​@HEADSORT.PFT"​ actab=AC-ANSI.TAB uctab=UC-ANSI.TAB fullinv=title tell=$TELL || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +cecho "​blue"​ " Archivo invertido - Base bibliografica..."​
 +# Antes de la FST, aplicamos un gizmo a los campos que generan puntos de acceso
 +mx biblio gizmo=DICTGIZ,​100,​110,​111,​130,​700,​710,​711,​730,​800,​810,​811,​830 gizmo=DICTGIZ,​240,​245,​246,​440,​740,​600,​610,​611,​630,​650,​651,​653,​655,​656 fst=@BIBLIO.FST actab=AC-ANSI.TAB uctab=UC-ANSI.TAB stw=@BIBLIO.STW fullinv=biblio tell=$TELL || error "Hubo una falla al ejecutar mx"
 +
 +
 +# ------------------------------------------------------------------
 +# REGISTROS ANALÍTICOS
 +# ------------------------------------------------------------------
 +
 +echo
 +cecho "​blue"​ "​Detectando registros analíticos..."​
 +# Para los registros analíticos,​ creamos un 773$9 donde guardar el MFN
 +# del registro asociado, y así ahorrar futuros lookups en el diccionario
 +# ATENCION: esto debe hacerse *después* de aplicado el msrt y generado el diccionario
 +
 +mx biblio "​proc=if p(v773^w) then '​d773a773¦',​v773,'​^9',​f(l('​-NC=',​v773^w),​1,​0),'​¦',​ fi" copy=biblio now -all tell=$TELL || error "Hubo una falla al ejecutar mx"
 +
 +# Compactamos la base
 +mx biblio create=bibliotmp now -all || error "Hubo una falla al ejecutar mx"
 +# no usamos rename, porque su sintaxis depende de la distribución de Linux
 +mv -f bibliotmp.mst biblio.mst || error
 +mv -f bibliotmp.xrf biblio.xrf || error
 +
 +
 +#echo
 +#cecho "​blue"​ "​Títulos de seriadas..."​
 +#mx biblio "​-BIBLEVEL=S"​ "​pft=replace(v245*2,'​^','​~'​)"​ now -all > title_serial.txt
 +
 +
 +# ------------------------------------------------------------------
 +# POSTINGS
 +# ------------------------------------------------------------------
 +
 +echo
 +# --------------------------------------------------------
 +cecho "​blue"​ "​Asignamos postings a los terminos del indice de temas."​
 +# --------------------------------------------------------
 +mx subj "​proc='​d11a11#',​f(npost(['​biblio'​]'​_SUBJ_'​v9),​1,​0),'#'"​ copy=subj now -all tell=$TELL || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +# ----------------------------------------------------------
 +cecho "​blue"​ "​Asignamos postings a los terminos del indice de nombres."​
 +# ----------------------------------------------------------
 +mx name "​proc='​d11a11#',​f(npost(['​biblio'​]'​_NAME_'​v9),​1,​0),'#'"​ copy=name now -all tell=$TELL || error "Hubo una falla al ejecutar mx"
 +
 +# TO-DO: necesitamos postings para los títulos controlados (series, títulos uniformes).
 +# Para eso necesitamos un subcampo $9 en la base de títulos.
 +
 +
 +# ------------------------------------------------------------------
 +# DICCIONARIOS PARA AGREP
 +# ------------------------------------------------------------------
 +
 +echo
 +# -----------------------------------------------------
 +cecho "​blue"​ "​Generamos diccionarios para AGREP."​
 +# Solo nos interesan claves asociadas a ciertos tags.
 +# /100 restringe la cantidad de postings (de lo contrario, da error)
 +# ATENCION: los sufijos NAME, SUBJ, TITLE van en mayusculas o minusculas
 +# en base a los valores que tome el parámetro CGI correspondiente.
 +# -----------------------------------------------------
 +cecho "​blue"​ " ​  - subj"
 +# Para bibima usamos la base MSC; para el resto, la base SUBJ
 +# TO-DO: la base subj también sirve para bibima; usar cat & uniq
 +if [ "​$DB_NAME"​ = "​bibima"​ ]; then
 +    mx dict=MSC "​pft=v1^*/"​ k1=a k2=zz now > dictSUBJ.txt || error "Hubo una falla al ejecutar mx"
 +else
 +    mx dict=subj "​pft=v1^*/"​ k1=a k2=zz now > dictSUBJ.txt || error "Hubo una falla al ejecutar mx"
 +fi
 +
 +cecho "​blue"​ " ​  - name"
 +mx dict=name "​pft=v1^*/"​ k1=a k2=zz now > dictNAME.txt || error "Hubo una falla al ejecutar mx"
 +
 +cecho "​blue"​ " ​  - title (incluye series)"​
 +#mx dict=biblio,​1,​2/​100 ​ "​pft=if v2^t : '​204'​ then v1^*/ fi" k1=a now > dicttitle.txt
 +ifkeys biblio +tags from=a to=zzzz > tmp/​titlekeys.txt || error "Hubo una falla al ejecutar ifkeys"​
 +mx seq=tmp/​titlekeys.txt "​pft=if '​204~404'​ : right(v2,3) then v3/ fi" now > tmp/​titlekeys2.txt || error "Hubo una falla al ejecutar mx"
 +cat tmp/​titlekeys2.txt | uniq > dictTITLE.txt || error
 +
 +cecho "​blue"​ " ​  - any"
 +# union de los diccionarios anteriores (eliminando términos duplicados)
 +cat dict*.txt | sort | uniq > dictANY.txt || error
 +
 +
 +# ------------------------------------------------------------------
 +# ARCHIVOS AUXILIARES
 +# ------------------------------------------------------------------
 +
 +echo
 +# -----------------------------------------------------
 +cecho "​blue"​ "Lista de codigos de idioma."​
 +# -----------------------------------------------------
 +mx seq=LANG.TXT create=tmp/​lang now -all || error "Hubo una falla al ejecutar mx"
 +mx tmp/lang fst=@LANG.FST fullinv=tmp/​lang || error "Hubo una falla al ejecutar mx"
 +mx dict=biblio "​k1=-LANG=A"​ "​k2=-LANG=ZZZ"​ "​pft=v1^**6.3,'​|',​v1^t/"​ now > tmp/​langcode.txt || error "Hubo una falla al ejecutar mx"
 +mx seq=tmp/​langcode.txt create=tmp/​langcode now -all || error "Hubo una falla al ejecutar mx"
 +msrt tmp/​langcode 30 "​ref(['​tmp/​lang'​]l(['​tmp/​lang'​]v1.3),​s(mpu,​v3))"​ || error "Hubo una falla al ejecutar msrt"
 +mx tmp/​langcode "​pft=v1,'​^p',​v2,'​^',/"​ now -all > langcode.txt || error "Hubo una falla al ejecutar mx"
 +
 +
 +if [ "​$DB_NAME"​ = "​bibima"​ ]; then
 + echo
 + # -----------------------------------------------------
 + cecho "​blue"​ "​Actualizamos los postings para cada código MSC"
 + # -----------------------------------------------------
 + mx MSC "​proc=if l(['​biblio'​]'​-MSC='​v1) > 0 then '​d7a7@',​f(npost(['​biblio'​]'​-MSC='​v1),​1,​0),'​@'​ fi" copy=MSC now -all tell=$TELL || error "Hubo una falla al ejecutar mx"
 + # TO-DO: compactar la base MSC
 +fi
 +
 +
 +echo
 +# -----------------------------------------------------
 +cecho "​blue"​ "Lista de codigos de bibliotecas."​
 +# -----------------------------------------------------
 +mx dict=biblio "​k1=-BIB=A"​ "​k2=-BIB=ZZZ"​ "​pft=v1^**5,'​^p',​v1^t/"​ now > bibcode.txt || error "Hubo una falla al ejecutar mx"
 +
 +
 +echo
 +# -----------------------------------------------------
 +cecho "​blue"​ "​Fechas extremas."​
 +# -----------------------------------------------------
 +mx dict=biblio "​k1=-F=1"​ "​k2=-F=2999"​ "​pft=v1^**3/"​ now > tmp/​dates1.txt || error "Hubo una falla al ejecutar mx"
 +mx tmp to=1 "​proc='​a1~',​replace(s(cat('​tmp/​dates1.txt'​)),​s(#​),'&'​),'​~'"​ "​pft=v1.4,'​-',​s(right(v1,​5)).4"​ > dates.txt || error "Hubo una falla al ejecutar mx"
 +
 +# -----------------------------------------------------
 +# Total de registros disponibles
 +# -----------------------------------------------------
 +echo > bases.txt || error
 +mx biblio count=1 "​pft=proc('​a5001~',​f(maxmfn-1,​1,​0),'​~'​),'​BIBLIOGRAPHIC_TOTAL=',​left(v5001,​size(v5001)-3),​if size(v5001) > 3 then '​.'​ fi,​right(v5001,​3)/"​ >> bases.txt || error "Hubo una falla al ejecutar mx"
 +mx name count=1 "​pft=proc('​a5001~',​f(maxmfn-1,​1,​0),'​~'​),'​NAME_TOTAL=',​left(v5001,​size(v5001)-3),​if size(v5001) > 3 then '​.'​ fi,​right(v5001,​3)/"​ >> bases.txt || error "Hubo una falla al ejecutar mx"
 +mx subj count=1 "​pft=proc('​a5001~',​f(maxmfn-1,​1,​0),'​~'​),'​SUBJ_TOTAL=',​left(v5001,​size(v5001)-3),​if size(v5001) > 3 then '​.'​ fi,​right(v5001,​3)/"​ >> bases.txt || error "Hubo una falla al ejecutar mx"
 +mx title count=1 "​pft=proc('​a5001~',​f(maxmfn-1,​1,​0),'​~'​),'​TITLE_TOTAL=',​left(v5001,​size(v5001)-3),​if size(v5001) > 3 then '​.'​ fi,​right(v5001,​3)/"​ >> bases.txt || error "Hubo una falla al ejecutar mx"
 +
 +# -----------------------------------------------------
 +# Total de ejemplares disponibles
 +# -----------------------------------------------------
 +
 +# ATENCION: necesitamos una buena definición de "​ejemplares"​ (los "​items"​ de FRBR)
 +# Por ahora, vamos a contar los nros. de inventario, 859$p
 +mx biblio "​pft=(v859^p/​)"​ now | wc -l > tmp/​items-total.txt || error "Hubo una falla al ejecutar mx"
 +mx seq=tmp/​items-total.txt "​pft=proc('​d1a1|',​replace(v1,'​ ',''​),'​|'​),​ if size(v1) > 3 then left(v1,​size(v1)-3),'​.',​right(v1,​3),​ else v1, fi" now > tmp/​items-total-punto.txt || error "Hubo una falla al ejecutar mx"
 +echo "​ITEMS_TOTAL=`cat tmp/​items-total-punto.txt`"​ >> bases.txt || error
 +
 +cat bases.txt || error
 +
 +echo
 +# -----------------------------------------------------
 +cecho "​blue"​ "​Listado de novedades."​
 +# -----------------------------------------------------
 +# TO-DO: generalizar para cualquier año y/o mes, y para otros criterios (e.g. en ABCI por inventario)
 +mx biblio "​pft=if v859^y[1]*6 = '​2006'​ then v1/ fi" now | sort > novedades.txt || error "Hubo una falla al ejecutar mx"
 +
 +echo
 +# -----------------------------------------------------
 +cecho "​blue"​ "Fecha de esta actualizacion."​
 +# -----------------------------------------------------
 +mx tmp "​pft=s(date)*6.2,'/',​s(date)*4.2,'/',​s(date).4,'​ a las ',​s(date)*9.2,':',​s(date)*11.2"​ to=1 > updated.txt || error "Hubo una falla al ejecutar mx"
 +
 +
 +# ------------------------------------------------------------------
 +# CONVERSION A WINDOWS
 +# ------------------------------------------------------------------
 +
 +if [ "​$CONVERT_WINDOWS"​ = "​1"​ ]; then
 + echo
 + cecho "​blue"​ "​Conversion a Windows: bases de datos."​
 + if [ ! -d "​windows"​ ]; then
 + mkdir windows || error "No se pudo crear el directorio windows"​
 + fi
 + #cecho "​blue"​ "​Directorio $2/windows creado."​
 +
 + cecho "​blue"​ " ​  - biblio"​
 + crunchmf biblio windows/​biblio || error "Hubo una falla al ejecutar crunchmf"​
 + crunchif biblio windows/​biblio || error "Hubo una falla al ejecutar crunchif"​
 +
 + cecho "​blue"​ " ​  - name"
 + crunchmf name windows/​name || error "Hubo una falla al ejecutar crunchmf"​
 + crunchif name windows/​name || error "Hubo una falla al ejecutar crunchif"​
 +
 + cecho "​blue"​ " ​  - subj"
 + crunchmf subj windows/​subj || error "Hubo una falla al ejecutar crunchmf"​
 + crunchif subj windows/​subj || error "Hubo una falla al ejecutar crunchif"​
 +
 + cecho "​blue"​ " ​  - title"
 + crunchmf title windows/​title || error "Hubo una falla al ejecutar crunchmf"​
 + crunchif title windows/​title || error "Hubo una falla al ejecutar crunchif"​
 +
 + cecho "​blue"​ "​Conversion a Windows: archivos de texto."​
 + cp *.txt windows/
 + unix2dos windows/​*.txt ​    
 +fi
 +
 +
 +# Eliminamos archivos temporales generados por este script
 +if [ "​$CLEAN"​ = "​1"​ ]; then
 + echo
 + cecho "​blue"​ "​Eliminando archivos temporales..."​
 + rm -rf tmp/ || error "No se puede eliminar el directorio tmp"
 + rm -rf *.ln* 2>/​dev/​null
 + rm -rf *.lk* 2>/​dev/​null
 +fi
 +
 +
 +# Movemos los archivos generados (previamente vaciamos $TARGET_DIR)
 +# TO-DO: supongamos que alguien quiere mover la versión para Windows de las bases...  ​
 +if [ "​$MOVE"​ = "​1"​ ]; then
 + echo
 + cecho "​blue"​ "​Moviendo los archivos generados..."​
 + rm -rf $TARGET_DIR/​* || error "No se puede vaciar el directorio $TARGET_DIR"​
 + mv -f *.* $TARGET_DIR || error "No se puede mover los archivos a $TARGET_DIR"​
 +fi
 +
 +# ¿esto es necesario?
 +CIPAR=
 +
 +echo
 +cecho "​blue"​ "​`basename $0` finalizó exitosamente. Hasta pronto."​
 +echo
 +exit 0
 +</​code>​
update-opac.sh.txt · Last modified: 06/05/2009 00:00 (external edit)