====== Script update-opac.sh ====== Este es el script utilizado para generar la actualización del OPAC. Versión: 2006.11.13. #!/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 {{tag>opacmarc admin}}