Difference between revisions of "ABCD - versiones bases de datos"

From ABCD Wiki
Jump to: navigation, search
(Created page with "Se tiene la siguiente situación: {| class="wikitable" border="1" |- ! cisis_ver ! charset |- | bigisis | ANSI<BR>UTF-8 |- | ffi | ANSI<BR>UTF-8 |- | 1660 - ansi | ANSI |- |...")
 
 
(5 intermediate revisions by the same user not shown)
Line 1: Line 1:
Se tiene la siguiente situación:
 
  
 +
'''Para Windows'''
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! cisis_ver
 
 
! charset
 
! charset
 +
! Versión Cisis
 +
|-style="vertical-align:top;"
 +
| "valign=top"|ansi
 +
| 16-60<br>bigisis<br>ffi
 +
|-style="vertical-align:top;"
 +
|utf8
 +
|  16-60<br>ffi
 +
 +
|}
 +
 +
'''Para Linux'''
 +
{| class="wikitable" border="1"
 
|-
 
|-
| bigisis
+
! charset
| ANSI<BR>UTF-8
+
! Versión Cisis
 +
|-style="vertical-align:top;"
 +
| "valign=top"|ansi
 +
| 16-60<br>bigisis<br>ffi
 +
|-style="vertical-align:top;"
 +
|utf8
 +
|  16-60<br>bigisis
 +
 
 +
|}
 +
 
 +
Desde el punto de vista de la instalación el directorio cgi-bin se presenta de la siguiente manera:
 +
[[File:Cgi-bin.png|none]]
 +
 
 +
Para acceder correctamente la version del cisis, el config.php utiliza tres variables:
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| ffi
+
! Variable
| ANSI<BR>UTF-8
+
! Valoe
|-
+
 
| 1660 - ansi
+
|-style="vertical-align:top;"
| ANSI
+
| $UNICODE
|-
+
| 0, el juego de caracteres es ansi<br>1, el juego de caracteres es utf8
| 1660 - utf-8
+
|-style="vertical-align:top;"
| UTF-8
+
| $cisis_ver
 +
| Coloca la versión del cisis según las siguientes posibilidades:
 +
* Si está en blanco se asume la versión 16-60 y el parámetro $UNICODE establecerá si se lee desde la carpeta '''ansi''' o desde la carpeta '''utf8'''
 +
* Si tiene otro valor (ffi, bigisis) se utiliza el mismo para direccionar al directorio donde está instalado la versión a utilizar
 +
|-style="vertical-align:top;"
 +
|$exe_ext
 +
| coloca la extensión del ejecutable '''wxis'''<br> si es windows tiene el valor '''.exe'''; <br> si es linux, está vacío
 
|}
 
|}
  
Entonces, en el caso de las versiones 1660-ansi y 1660-utf8,  charset se deriva de la versión. En el resto de los casos hay que especificar el charset.
+
Para determinar cuál versión de cisis va a utilizarse para gestionar una base de datos, en el archivo config.php se toman las siguientes decisiones:
 +
 
 +
* Se define el path a la carpeta cgi-bin mediante la asignación
 +
      '''$cgibin_path=$ABCD_path."www/cgi-bin/"; '''
 +
::$ABCD_path es el camino de acceso a la carpeta donde está instalado ABCD y se define a principio del script
 +
 
 +
* Se lee el archivo abcd.def donde deben figurar los parámetros
 +
    '''$def["UNICODE"]''' y
 +
    '''$def["CISIS_VERSION"]'''
 +
 
 +
* Se incorpora el script config_extended.php y si hay alguna base de datos activa ($_REQUEST["base"]) se lee el archivo '''dr_path.dat''' que puede reconfigurar los parámetros '''$def["UNICODE"]''' y '''$def["CISIS_VERSION"]'''
 +
* A partir de aquí se toman las siguientes decisiones:
 +
::: si $def["UNICODE"] no está definida o tiene un valor 0 o ansi, entonces se define
 +
          $unicode='ansi';
 +
          $charset="ISO-8859-1";
 +
::: si $def["UNICODE"] vale 1, entonces se define
 +
          $unicode='utf8';
 +
          $charset="UTF-8";
  
Si esto es así, yo eliminaría la variable UNICODE y me quedaría solo con $cisis_ver y $charset. En código del config.php desarrollaríamos la lógica para generar $charset a partir de UNICODE.
+
* Con estos valores se puede establecer la ruta hacia el ejecutable a utilizar para gestionar la base de datos:
 +
          $cisis_path=$cgibin_path.$unicode."/".$cisis_ver."/";
 +
:::Entonces, el ejecutable se forma de la siguiente manera:
 +
         
 +
          '''cuando el método es post'''
 +
          $wxisUrl=$server_url."/cgi-bin/".$cisis_ver.$wxis_exec;
 +
         
 +
          '''si el método es GET'''
 +
          $Wxis=$cisis_path.$wxis_exec;
  
En los parámetros del dr_path.dat entonces se pedirían los valores de $cisis_ver y $charset.
 
  
Hay una tercera variable importante que viene del php.ini y se denomina '''default_charset''' que en algunos servidores viene como '''UTF-8''' y en otros como ISO-8859-1. Si es UTF-8 entonces hay que incluir el comando 
+
 
 +
'''HTML - Content-Type'''
 +
 
 +
Hay una tercera variable importante que viene del php.ini y se denomina '''default_charset''' que en algunos servidores viene como '''UTF-8''' y en otros como ISO-8859-1. Si es UTF-8 el juego de caracteres de la base de datos es '''ansi'' entonces en el '''config.php''' se incluye el comando
 
       header('Content-Type: text/html; charset=iso-8859-1'); 
 
       header('Content-Type: text/html; charset=iso-8859-1'); 
en el config.php del módulo central para aquellas instalaciones que trabajan con lenguajes latinos porque los mensajes del sistema están en iso-8859-1 y no en utf-8. Igual ocurre con las bases de datos que se han desarrollado usando 1660-ansi. Por eso es que a veces reportan que los caracteres aparecen distorsionados. Lo incluyo en el config.php porque todos los scripts lo leen al principio y ese debe ser el primer comando de la página generada.
+
ya que las bases de datos y archivos de mensajes están en '''ansi'''
 +
 
 +
En el config.php se incluye entonces:
 +
      if (ini_get('default_charset')=="UTF-8" and $unicode=="ansi")
 +
  header('Content-Type: text/html; charset=iso-8859-1');
 +
 
 +
 
 +
'''Presentar en una misma página la información proveniente de bases de datos en diferentes versiones'''
 +
 
 +
Supongamos que en el sistema de préstamos la base de datos catalográfica y la de usuarios están en versión '''utf8''' mientras que transacciones (trans) y suspensiones y multas (suspml) están en versión '''ansi'''. Esta situación es más complicada por cuanto en un mismo proceso hay que extraer información de bases de datos en versiones diferentes.
 +
 
 +
El config.php se lee al inicio del script por lo que necesitamos un mecanismo que nos varíe la versión dependiendo de la base de datos que se está procesando.  Esta situación se resuelve a través del script '''common/wxis_llamar.php''' el cual tiene a su cargo acceder la base de datos.
 +
 
 +
Para poder hacer el cambio de versiones, en el '''abcd.def''' debe activarse el parámetro '''MULTIPLE_DB_FORMATS''' para indicarle a '''wxis_llamar.php''' que debe verificar con cual versión se ha de leer la base de datos. Por ello, si en '''wxis_llamar.php''' se detecta que el parámetro '''MULTIPLE_DB_FORMATS''' está habilitado, se procederá a leer el archivo '''dr_path.def''' de la base de datos para verificar la versión de cisis a utilizar para gestionar los registros:
 +
      parse_str($query, $arr_query);
 +
      $actual_db=$arr_query["base"];
 +
      $charset_db="";
 +
      if (isset($_SESSION["MULTIPLE_DB_FORMATS"]) and $_SESSION["MULTIPLE_DB_FORMATS"]=="Y" or isset($MULTIPLE_DB_FORMATS) and $MULTIPLE_DB_FORMATS=="Y"){
 +
            if (file_exists($db_path.$actual_db."/dr_path.def")){
 +
                $def_db = parse_ini_file($db_path.$actual_db."/dr_path.def");
 +
                $cisis_ver="";
 +
                if (isset($def_db["CISIS_VERSION"]) and $def_db["CISIS_VERSION"]!="16-60" )
 +
                    $cisis_ver=$def_db["CISIS_VERSION"];
 +
                    if ( !isset($def_db["UNICODE"]) or $def_db["UNICODE"] == "ansi" || $def_db["UNICODE"] == '0' ) {
 +
                          $unicode='ansi';
 +
                          $charset="ISO-8859-1";
 +
                    } else {
 +
                          $unicode='utf8';
 +
                          $charset="UTF-8";
 +
                    }
 +
                    $cisis_path=$cgibin_path.$unicode."/".$cisis_ver."/";  // path to directory with correct CISIS-executables
 +
                    $mx_path=$cisis_path.$mx_exec;                          // path to mx-executable
 +
                    if ($postMethod == '1'){
 +
                        $wxisUrl=$server_url."/cgi-bin/$unicode/".$cisis_ver.$wxis_exec;  // POST method used
 +
                        $Wxis="";
 +
                    }else{
 +
                        $wxisUrl="";
 +
                        $Wxis=$cisis_path.$wxis_exec;  //GET method is used
 +
                    }
 +
                }
 +
      }
 +
   
 +
 
 +
 
 +
En '''wxis_llamar.php''' se agregó una rutina que que permite trabajar bases de datos en ANSI cuando el juego de caracteres establecido.
 +
 
 +
        $cset=strtoupper($charset);
 +
        if (!isset( $charset_db)or $charset_db=="") $charset_db="ANSI";
 +
        $cset_db=strtoupper($charset_db);
 +
        if ($cset_db!=$cset){
 +
          foreach ($contenido as $value) {
 +
              if ($cset=="UTF-8" and $cset_db=="ISO-8859-1"){
 +
                    $cont_cnv[]=utf8_encode($value);
 +
              } else{
 +
                    $cont_cnv[]=utf8_decode($value)
 +
              }
 +
          }
 +
          if (isset($cont_cnv) and count($cont_cnv)>0) $contenido=$cont_cnv;
 +
        }
 +
               
  
Entonces, hay una tercera variable importantr que es el '''encoding''' de la página el cual debe coincidir con el establecido en
+
# Se lee el charset establecido para la página ($cset=strtoupper($charset))
En el caso de ABCD-Central, el encoding de la página lo determina $charset por cuanto             
+
# Se lee el charset de la base de datos, $charset_db, (leído del dr_path.dat). Si no está definido se asume '''ANSI'''
 +
# Si el charset de la la base de datos no es igual al charset de la página se convierte la salida del wxis ($contenido) al charset de la página
 +
    NOTA: la conversion de utf-8 a ansi puede generar inconsistencias

Latest revision as of 16:31, 4 March 2020

Para Windows

charset Versión Cisis
ansi 16-60
bigisis
ffi
utf8 16-60
ffi

Para Linux

charset Versión Cisis
ansi 16-60
bigisis
ffi
utf8 16-60
bigisis

Desde el punto de vista de la instalación el directorio cgi-bin se presenta de la siguiente manera: none

Para acceder correctamente la version del cisis, el config.php utiliza tres variables:

Variable Valoe
$UNICODE 0, el juego de caracteres es ansi
1, el juego de caracteres es utf8
$cisis_ver Coloca la versión del cisis según las siguientes posibilidades:
  • Si está en blanco se asume la versión 16-60 y el parámetro $UNICODE establecerá si se lee desde la carpeta ansi o desde la carpeta utf8
  • Si tiene otro valor (ffi, bigisis) se utiliza el mismo para direccionar al directorio donde está instalado la versión a utilizar
$exe_ext coloca la extensión del ejecutable wxis
si es windows tiene el valor .exe;
si es linux, está vacío

Para determinar cuál versión de cisis va a utilizarse para gestionar una base de datos, en el archivo config.php se toman las siguientes decisiones:

  • Se define el path a la carpeta cgi-bin mediante la asignación
     $cgibin_path=$ABCD_path."www/cgi-bin/";  
$ABCD_path es el camino de acceso a la carpeta donde está instalado ABCD y se define a principio del script
  • Se lee el archivo abcd.def donde deben figurar los parámetros
   $def["UNICODE"] y
   $def["CISIS_VERSION"]
  • Se incorpora el script config_extended.php y si hay alguna base de datos activa ($_REQUEST["base"]) se lee el archivo dr_path.dat que puede reconfigurar los parámetros $def["UNICODE"] y $def["CISIS_VERSION"]
  • A partir de aquí se toman las siguientes decisiones:
si $def["UNICODE"] no está definida o tiene un valor 0 o ansi, entonces se define
          $unicode='ansi';
          $charset="ISO-8859-1";
si $def["UNICODE"] vale 1, entonces se define
          $unicode='utf8';
          $charset="UTF-8";
  • Con estos valores se puede establecer la ruta hacia el ejecutable a utilizar para gestionar la base de datos:
          $cisis_path=$cgibin_path.$unicode."/".$cisis_ver."/";
Entonces, el ejecutable se forma de la siguiente manera:
         cuando el método es post
         $wxisUrl=$server_url."/cgi-bin/".$cisis_ver.$wxis_exec;
         
         si el método es GET
         $Wxis=$cisis_path.$wxis_exec;


HTML - Content-Type

Hay una tercera variable importante que viene del php.ini y se denomina default_charset' que en algunos servidores viene como UTF-8 y en otros como ISO-8859-1. Si es UTF-8 el juego de caracteres de la base de datos es ansi entonces en el config.php se incluye el comando

     header('Content-Type: text/html; charset=iso-8859-1'); 

ya que las bases de datos y archivos de mensajes están en ansi

En el config.php se incluye entonces:

     if (ini_get('default_charset')=="UTF-8" and $unicode=="ansi")

header('Content-Type: text/html; charset=iso-8859-1');


Presentar en una misma página la información proveniente de bases de datos en diferentes versiones

Supongamos que en el sistema de préstamos la base de datos catalográfica y la de usuarios están en versión utf8 mientras que transacciones (trans) y suspensiones y multas (suspml) están en versión ansi. Esta situación es más complicada por cuanto en un mismo proceso hay que extraer información de bases de datos en versiones diferentes.

El config.php se lee al inicio del script por lo que necesitamos un mecanismo que nos varíe la versión dependiendo de la base de datos que se está procesando. Esta situación se resuelve a través del script common/wxis_llamar.php el cual tiene a su cargo acceder la base de datos.

Para poder hacer el cambio de versiones, en el abcd.def debe activarse el parámetro MULTIPLE_DB_FORMATS para indicarle a wxis_llamar.php que debe verificar con cual versión se ha de leer la base de datos. Por ello, si en wxis_llamar.php se detecta que el parámetro MULTIPLE_DB_FORMATS está habilitado, se procederá a leer el archivo dr_path.def de la base de datos para verificar la versión de cisis a utilizar para gestionar los registros:

     parse_str($query, $arr_query);
     $actual_db=$arr_query["base"];
     $charset_db="";
     if (isset($_SESSION["MULTIPLE_DB_FORMATS"]) and $_SESSION["MULTIPLE_DB_FORMATS"]=="Y" or isset($MULTIPLE_DB_FORMATS) and $MULTIPLE_DB_FORMATS=="Y"){
           if (file_exists($db_path.$actual_db."/dr_path.def")){
               $def_db = parse_ini_file($db_path.$actual_db."/dr_path.def");
               $cisis_ver="";
               if (isset($def_db["CISIS_VERSION"]) and $def_db["CISIS_VERSION"]!="16-60" )
                   $cisis_ver=$def_db["CISIS_VERSION"];
                   if ( !isset($def_db["UNICODE"]) or $def_db["UNICODE"] == "ansi" || $def_db["UNICODE"] == '0' ) {
                         $unicode='ansi';
                         $charset="ISO-8859-1";
                   } else {
                         $unicode='utf8';
                         $charset="UTF-8";
                   }
                   $cisis_path=$cgibin_path.$unicode."/".$cisis_ver."/";   // path to directory with correct CISIS-executables
                   $mx_path=$cisis_path.$mx_exec;                          // path to mx-executable
                   if ($postMethod == '1'){ 
                        $wxisUrl=$server_url."/cgi-bin/$unicode/".$cisis_ver.$wxis_exec;  // POST method used
                        $Wxis="";
                   }else{
                        $wxisUrl="";
                        $Wxis=$cisis_path.$wxis_exec;   //GET method is used
                   }
               }
     }
    


En wxis_llamar.php se agregó una rutina que que permite trabajar bases de datos en ANSI cuando el juego de caracteres establecido.

       $cset=strtoupper($charset); 
       if (!isset( $charset_db)or $charset_db=="") $charset_db="ANSI";
       $cset_db=strtoupper($charset_db);
       if ($cset_db!=$cset){
          foreach ($contenido as $value) {
              if ($cset=="UTF-8" and $cset_db=="ISO-8859-1"){
                   $cont_cnv[]=utf8_encode($value);
              } else{
                    $cont_cnv[]=utf8_decode($value)
              } 
          }
          if (isset($cont_cnv) and count($cont_cnv)>0) $contenido=$cont_cnv;
       }
               
  1. Se lee el charset establecido para la página ($cset=strtoupper($charset))
  2. Se lee el charset de la base de datos, $charset_db, (leído del dr_path.dat). Si no está definido se asume ANSI
  3. Si el charset de la la base de datos no es igual al charset de la página se convierte la salida del wxis ($contenido) al charset de la página
   NOTA: la conversion de utf-8 a ansi puede generar inconsistencias