Script opac.bat

OBSOLETO
@echo off :: =================================================================== :: OPAC.BAT :: :: Este script genera el conjunto de archivos utilizados en el OPAC. :: :: Requiere utilitarios CISIS: mx, msrt, i2id, id2i. Para conversión :: de las bases a Linux, necesita crunchmf y crunchif. :: :: Opciones de configuracion: :: path del cipar :: path de los utilitarios CISIS :: conversion de bases a Linux :: :: La base de origen debe tener la codificacion "ANSI". Las bases :: creadas con Catalis ya traen esa codificacion. :: :: Usamos "seq=filename.id¦" para que el poco probable :: caracter '¦' sea tomado como delimitador de campos (y, en :: consecuencia, no tengamos separacion en campos). Quizas :: convenga emplear otro caracter? Revisar. :: :: ATENCION: como hacemos si los registros ya vienen con ^9 en los :: campos de encabezamientos? :: :: TO-DO: reescribir esto como un script Bash para Linux. :: :: TO-DO: Necesitamos medir el tiempo de ejecucion del script, y :: revisar de manera general su diseño, porque es bastante lento :: (en un Pentium III) :: :: (c) 2003-2004 Fernando J. Gomez - CONICET - INMABB :: =================================================================== :: CONFIGURACION set CONVERT_LINUX=1 :: CONFIGURACION :: Agregamos al PATH el directorio de los utilitarios CISIS set PATH=%PATH%;D:\cisis :: Parametros obligatorios (base de origen y directorio destino) if .%1==. goto SYNTAX if .%2==. goto SYNTAX cls :: CONFIGURACION :: Hay que usar el path *absoluto* para el cipar set CIPAR=D:\opac\opac.cip if not exist %CIPAR% goto ERROR_CIPAR echo Archivo cipar encontrado. :: Verificamos la existencia de la base de origen if not exist %1.mst goto ERROR_DB_ORIGIN if not exist %1.xrf goto ERROR_DB_ORIGIN echo Base de origen encontrada. :: Creamos el directorio destino, si es necesario :: ATENCION: en Win2K a veces genera un error, sin razon aparente. Hay que reintentar, :: o bien hacer un cd al directorio %2 seguido de un cd.. para regresar if not exist %2\nul mkdir %2 if errorlevel 1 goto ERROR_MKDIR echo Directorio %2 creado. if not exist %2\tmp\nul mkdir %2\tmp if errorlevel 1 goto ERROR_MKDIR_TMP echo Directorio %2\tmp creado. :BIBLIO_DATABASE_1 echo. echo Creamos una copia (texto) de la base bibliografica. set MAXCOUNT=30000 if not %3.==. set MAXCOUNT=%3 i2id %1 count=%MAXCOUNT% tell=1000 > %2\tmp\biblio1.id :: A partir de ahora, trabajamos en el directorio destino cd %2 ::if errorlevel 1 goto ERROR_CHANGE_DIR echo. echo Directorio de trabajo: %2 :: Lista de tags de los cuales vamos a extraer los encabezamientos set SUBJ_TAGS=v600v610v611v630v650v651v653v655v656 set NAME_TAGS=v100v110v111v700v710v711 :: Valores del 2do indicador en campos 6xx que no deseamos considerar set IGNORE_SUBJ_HEADINGS=#6 echo. echo Intentamos normalizar la puntuacion final, filtramos encabezamientos echo tematicos, y asignamos un numero (provisorio) a cada campo echo de encabezamientos en el subcampo ^9. mx "seq=tmp\biblio1.id¦" lw=3000 "pft=@HEAD.PFT" now tell=1000 > tmp\biblio2.id :SUBJ_DATABASE echo. echo ----------------------------------------------------- echo Base de encabezamientos tematicos echo ----------------------------------------------------- echo Creamos el listado de encabezamientos tematicos. mx "seq=tmp\biblio2.id¦" lw=1000 "pft=if getenv('SUBJ_TAGS') : v1*1.4 then @SUBJ.PFT fi" now tell=1000 > tmp\subj1.id echo. echo Convertimos el listado en una base (desordenada y con duplicados). id2i tmp\subj1.id create/app=tmp\subj1 tell=1000 echo. echo 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=1000 echo. echo 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=5000 echo. echo Ordenamos la base de encabezamientos tematicos. msrt tmp\subj1 100 v99 tell=5000 echo. echo 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=1000 > tmp\subjcode.seq echo. echo Eliminamos los encabezamientos duplicados. mx tmp\subj1 lw=1000 "pft=@ELIMDUP2.PFT" now tell=1000 > tmp\subj.id echo. echo Creamos la base de encabezamientos tematicos (ordenada y sin duplicados). id2i tmp\subj.id create/app=subj tell=1000 :NAME_DATABASE echo. echo ----------------------------------------------------- echo Base de encabezamientos de nombres echo ----------------------------------------------------- echo Creamos el listado de encabezamientos de nombres mx "seq=tmp\biblio2.id¦" lw=1000 "pft=if getenv('NAME_TAGS') : v1*1.4 then @NAME.PFT fi" now tell=1000 > tmp\name1.id echo. echo Convertimos el listado en una base (desordenada y con duplicados). id2i tmp\name1.id create/app=tmp\name1 tell=1000 echo. echo 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=1000 echo. echo 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=5000 echo. echo Ordenamos la base de encabezamientos de nombres. msrt tmp\name1 100 v99 tell=5000 echo. echo 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=1000 > tmp\namecode.seq echo. echo Eliminamos los encabezamientos duplicados. mx tmp\name1 lw=1000 "pft=@ELIMDUP2.PFT" now tell=1000 > tmp\name.id echo. echo Creamos base de encabezamientos de nombres (ordenada y sin duplicados). id2i tmp\name.id create/app=name tell=1000 echo. :: ----------------------------------------------------------------- echo Reasignamos numeros a los encabezamientos en los registros echo bibliograficos (subcampo 9). :: ----------------------------------------------------------------- mx seq=tmp\subjcode.seq create=tmp\subjcode now -all mx tmp\subjcode "fst=1 0 v1" fullinv=tmp\subjcode mx seq=tmp\namecode.seq create=tmp\namecode now -all mx tmp\namecode "fst=1 0 v1" fullinv=tmp\namecode mx "seq=tmp\biblio2.id¦" lw=1000 "pft=@RECODE.PFT" now tell=1000 > tmp\biblio3.id :TITLE_DATABASE echo. echo ----------------------------------------------------- echo Base de titulos echo ----------------------------------------------------- :: Lista de campos que se incluyen en la base TITLE. ATENCION: completar/revisar ::set TITLE_TAGS=v130~v245~v246~v700~v730~v740~v765~v773 set TITLE_TAGS=v130~v240~v245~v246~v730~v740~v765~v773 echo Creamos listado de titulos. mx "seq=tmp\biblio3.id¦" lw=1000 "pft=if getenv('TITLE_TAGS') : v1*1.4 then ,@TITLE.PFT, fi" now tell=1000 > tmp\title1.id echo. echo Convertimos el listado en una base (desordenada y con duplicados). id2i tmp\title1.id create/app=tmp\title1 tell=1000 echo. echo Almacenamos en un campo auxiliar la clave de ordenacion de titulos. mx tmp\title1 uctab=UC-ANSI.TAB "proc='d99a99¦',@HEADSORT.PFT,'¦'" copy=tmp\title1 now -all tell=5000 echo. echo Ordenamos la base de titulos. msrt tmp\title1 100 v99 tell=5000 echo. echo Eliminamos los titulos duplicados. mx tmp\title1 lw=1000 "pft=@ELIMDUP2.PFT" now tell=1000 > tmp\title.id echo. echo Creamos la base de titulos (ordenada y sin duplicados). id2i tmp\title.id create/app=title tell=1000 :BIBLIO_DATABASE_2 echo. :: --------------------------------------------- echo Recreamos la base bibliografica. :: --------------------------------------------- id2i tmp\biblio3.id create=biblio tell=1000 echo. :: --------------------------------------------- echo Ordenamos la base bibliografica. :: --------------------------------------------- msrt biblio 100 @LOCATION_SORT.PFT tell=5000 :FULLINV :: ------------------------------------------------------------------- :: Generacion de archivos invertidos. :: ATENCION: AC-ANSI.TAB envia los numeros al diccionario. :: ------------------------------------------------------------------- echo. echo --------------------------------------------- echo Archivo invertido - Base de temas ... echo --------------------------------------------- mx subj fst=@HEADINGS.FST actab=AC-ANSI.TAB uctab=UC-ANSI.TAB fullinv=subj tell=2000 echo. echo --------------------------------------------- echo Archivo invertido - Base de nombres ... echo --------------------------------------------- mx name fst=@HEADINGS.FST actab=AC-ANSI.TAB uctab=UC-ANSI.TAB fullinv=name tell=2000 echo. echo --------------------------------------------- echo Archivo invertido - Base de titulos ... echo --------------------------------------------- mx title "fst=2 0 '~',@HEADSORT.PFT" actab=AC-ANSI.TAB uctab=UC-ANSI.TAB fullinv=title tell=2000 echo. echo --------------------------------------------- echo Archivo invertido - Base bibliografica ... echo --------------------------------------------- mx biblio gizmo=DICTGIZ fst=@BIBLIO.FST actab=AC-ANSI.TAB uctab=UC-ANSI.TAB stw=@BIBLIO.STW fullinv=biblio tell=2000 :POSTINGS echo. :: -------------------------------------------------------- echo 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=1000 echo. :: ---------------------------------------------------------- echo 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=1000 :AGREP_DICTIONARIES echo. :: ----------------------------------------------------- echo 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 parametro CGI correspondiente. :: ----------------------------------------------------- echo - subj :: Para bibima usamos la base MSC; para el resto, la base SUBJ if %2==bibima mx dict=\httpd\bases\catalis_pack\opacmarc\msc2000\msc "pft=v1^*/" k1=a k2=zz now > dictSUBJ.txt if not %2==bibima mx dict=subj "pft=v1^*/" k1=a k2=zz now > dictSUBJ.txt echo - name mx dict=name "pft=v1^*/" k1=a k2=zz now > dictNAME.txt echo - title ::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 mx seq=tmp\titlekeys.txt "pft=if v2:'204' then v3/ fi" now > dictTITLE.txt :LANG echo. :: ----------------------------------------------------- echo Lista de codigos de idioma. :: TO-DO: revisar (OEM2ANSI?) :: ----------------------------------------------------- mx seq=LANG.TXT create=LANG now -all mx LANG fst=@LANG.FST fullinv=LANG mx dict=biblio k1=-LANG=A k2=-LANG=ZZZ "pft=v1^**6.3,'|',v1^t/" now > langcode.txt mx seq=langcode.txt create=langcode now -all msrt langcode 30 "mpu,ref(['LANG']l(['LANG']v1.3),v3)" mx langcode "pft=v1,'^p',v2,'^',/" now -all > langcode.txt ::mx LANG gizmo=OEM2ANSI copy=LANG now -all echo. :: ----------------------------------------------------- echo Lista de codigos de bibliotecas. :: ----------------------------------------------------- mx dict=biblio k1=-BIB=A k2=-BIB=ZZZ "pft=v1^**5,'^p',v1^t/" now > bibcode.txt echo. :: ----------------------------------------------------- echo Fechas extremas. :: ----------------------------------------------------- mx dict=biblio "k1=-F=1" "k2=-F=2999" "pft=v1^**3/" now > tmp\dates1.txt mx tmp to=1 "proc='a1~',replace(s(cat('tmp\dates1.txt')),s(#),'&'),'~'" "pft=v1.4,'-',s(right(v1,5)).4" > dates.txt echo. :: ----------------------------------------------------- echo Total de registros disponibles. :: ----------------------------------------------------- echo. > bases.par 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.par 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.par 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.par 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.par echo. :: ----------------------------------------------------- echo Fecha de esta actualizacion. :: ----------------------------------------------------- mx tmp "pft=s(date)*6.2'/'s(date)*4.2'/'s(date).4" to=1 > updated.txt echo. :: ----------------------------------------------------------- ::echo Eliminamos archivos auxiliares generados por este script :: ----------------------------------------------------------- ::del tmp\*.* 2>nul del *.ln* 2>nul del *.lk* 2>nul if not %CONVERT_LINUX% == 1 goto NO_LINUX echo. :: ----------------------------------------------------------- echo Conversion de bases de datos a Linux. :: ----------------------------------------------------------- if not exist linux\nul mkdir linux ::if errorlevel 1 goto ERROR_MKDIR_LINUX echo Directorio %2\linux creado. echo - biblio crunchmf biblio linux\biblio crunchif biblio linux\biblio echo - name crunchmf name linux\name crunchif name linux\name echo - subj crunchmf subj linux\subj crunchif subj linux\subj echo - title crunchmf title linux\title crunchif title linux\title :NO_LINUX echo. :: -------------------------------------------------------- echo Eliminamos archivos temporales del OPAC. :: ATENCION: esto en realidad debe hacerse en el *servidor* :: -------------------------------------------------------- del \httpd\cgi-bin\opacmarc\temp\*.$$$ 2>nul echo. echo --------------------------------------------- echo Ejecucion de %0.bat finalizada. echo --------------------------------------------- echo. echo. :: ATENCION: 'cd..' podria no ser lo que queremos siempre cd .. goto END :SYNTAX type %0.syn echo. goto END :ERROR_CIPAR echo. echo ------------------------------------------------------------------ echo *** ATENCION *** echo No se ha encontrado el archivo cipar: %CIPAR% echo ------------------------------------------------------------------ echo. goto END :ERROR_DB_ORIGIN echo. echo ------------------------------------------------------------------ echo *** ATENCION *** echo No se ha encontrado la base de datos de origen, echo %1 echo ------------------------------------------------------------------ echo. goto END :ERROR_MKDIR echo. echo ------------------------------------------------------------------ echo *** ATENCION *** echo No se pudo crear el directorio %2 echo Bajo Windows 2000 a veces se genera este error, sin razon echo aparente; en tal caso, reintente. echo ------------------------------------------------------------------ echo. goto END :ERROR_MKDIR_TMP echo. echo ------------------------------------------------------------------ echo *** ATENCION *** echo No se pudo crear el directorio %2\tmp echo Bajo Windows 2000 a veces se genera este error, sin razon echo aparente; en tal caso, reintente. echo ------------------------------------------------------------------ echo. goto END :ERROR_CHANGE_DIR echo. echo ------------------------------------------------------------------ echo *** ATENCION *** echo No se pudo cambiar al directorio %2 echo ------------------------------------------------------------------ echo. goto END :END set CIPAR=