Capítulo 8: Acceso a bases de datos remotas: Host IBM 8. ACCESO A BASES DE DATOS REMOTAS: HOST IBM 8.1 INTRODUCCIÓN El objetivo es acceder a la información almacenada en un Host IBM, situado en el Rectorado de la Universidad Politécnica de Madrid, con el objetivo de desarrollar una aplicación que permita a los usuarios conocer sus calificaciones en la última convocatoria de exámenes. A continuación se describen ciertas características del Host que resultan relevantes para comprender la aplicación a desarrollar. 8.2 EL SISTEMA OPERATIVO VM/SP El sistema operativo del Host IBM es el VM/SP versión 4 (Virtual Machine/System Product). Se basa en el concepto de máquina virtual; dedica a cada usuario parte de los recursos y dispositivos reales del Host, de forma que en la práctica el usuario tiene la impresión de disponer de un ordenador (con sus periféricos correspondientes) para él sólo, sin tener que preocuparse de cómo se gestiona el reparto de dichos recursos. Cada máquina virtual necesita su propio sistema operativo, que se denomina CMS (Conversational Monitor System). También se necesita otro sistema operativo que coordine las actividades de las diferentes máquinas virtuales, denominado CP (Control Program). Los mandatos correspondientes a CP empiezan con las letras ‘CP’, mientras que los de CMS no llevan ningún prefijo. Pág. 8-1 Capítulo 8: Acceso a bases de datos remotas: Host IBM 8.3 PROGRAMAS RESIDENTES EN EL HOST Para acceder a la información contenida en el Host será necesario ejecutar ciertos programas residentes en el Host, que serán los que se encarguen de acceder a las bases de datos del mismo. En concreto, se ocuparán de verificar la identificación del usuario y su clave de acceso, cambiar dicha clave y buscar la información que el usuario demande. 8.4 MENSAJES DEL SISTEMA La pantalla del Host se divide en dos zonas, separadas por una línea continua. La zona bajo esa línea se denomina área de estado de la pantalla, y puede contener diversos indicadores. Algunos reflejan el modo de utilización de la pantalla, y otros diversas condiciones de error. La parte superior se divide en tres áreas: • • • Area de entrada de datos: situada en las líneas inferiores de la pantalla. Es la zona en la que se introducen los comandos. Area de salida: toda la pantalla, excepto las dos últimas líneas. Contiene la información generada por el Host y la introducida por el usuario, según el orden de operación. Area de estado de la máquina virtual: situada a la derecha de la última línea e inmediatamente encima de la línea continua. Indica al usuario cuál es el estado de la máquina virtual. En el área de estado de la máquina virtual pueden aparecer diferentes mensajes. De todos ellos sólo deberemos tener en cuenta un pequeño subconjunto, con el fin de decidir diferentes acciones. Concretamente: • • • MAS...: aparece cuando las líneas introducidas o las producidas por el programa que se haya ejecutado superan el tamaño de la pantalla. En este caso hay que borrar la pantalla para que pueda aparecer la información que falta. El borrado de la pantalla se realiza pulsando la tecla Pausa del teclado del PC. Si no se pulsa dicha tecla, la pantalla se borrará automáticamente transcurrido un minuto. DE INTRO: indica al usuario que debe pulsar la tecla Intro que está situada en la zona del teclado numérico del PC. Esta tecla ejerce las funciones del Return convencional que está situado junto a la zona del teclado alfabético. Listo: aparece cuando la máquina virtual está lista para recibir comandos del usuario. Pág. 8-2 Capítulo 8: Acceso a bases de datos remotas: Host IBM 8.5 COMENZANDO Y SESIÓN CON EL HOST FINALIZANDO UNA A continuación se describen cuáles son las acciones que debe realizar un usuario para poder comenzar y finalizar una sesión con el Host. La secuencia a seguir es muy importante, pues la aplicación desarrollada debe realizarlas en el mismo orden. • Comienzo de una sesión: • • • • • Después de poner en marcha el terminal aparecerá el logotipo de la instalación en pantalla. En esta pantalla debemos elegir el área del Host en el que vamos a trabajar, pues hay definidas varias, dependiendo del tipo de aplicación, su fiabilidad y niveles de seguridad. Para indicar el área del Host en que trabajaremos, primero borramos la pantalla (tecla Pausa del teclado del PC) y después introducimos el nombre del área deseada. Una vez introducido el nombre, aparecerá una segunda pantalla en la que se nos solicitará el identificador y la clave de acceso. Una vez que el sistema compruebe que tenemos autorización para acceder, nos informará de que está preparado para comenzar a trabajar cuando aparezca el mensaje ‘Listo’ en el área de salida de datos de la pantalla del Host. Finalización de una sesión: • • • Desde cualquier pantalla podemos finalizar una sesión utilizando el comando logoff. Una vez ejecutado este comando, el Host presentará una pantalla en la que debemos introducir el comando vmexit. Después de ejecutada esta orden, el Host quedará en la pantalla inicial, desde la cual podremos iniciar una nueva sesión de trabajo en cualquier momento. 8.6 ACCESO A LAS BASES DE DATOS DEL HOST El acceso se puede hacer de dos formas, según se describe a continuación. 8.6.1 Mediante comandos SQL introducidos directamente por el usuario Para ello, el Host dispone de un intérprete SQL, que puede ser invocado tecleando en cualquier momento el comando isql. Pág. 8-3 Capítulo 8: Acceso a bases de datos remotas: Host IBM Tiene la ventaja de permitir realizar consultas rápidas, en cualquier momento, para comprobar los nombres de las tablas, columnas, etc. Pero, al mostrar todos los datos en pantalla, y con un formato impredecible, resulta incómoda su utilización por parte de una aplicación. 8.6.2 Utilizando programas escritos en PL/1 PL/1 es un lenguaje de cuarta generación que permite la ejecución de comandos SQL sobre las bases de datos del sistema. Su utilización presenta la ventaja de que, si se conocen previamente los comandos SQL a ejecutar, así como las acciones que corresponden, estos resultan transparentes a la aplicación que los utiliza, pues a ésta le basta con ejecutar el fichero ejecutable correspondiente, resultado de la compilación del fichero con el programa PL/1. En nuestro caso, se ha optado por utilizar este lenguaje, pues para la funcionalidad que se pretende añadir sólo hacen falta unas cuantas sentencias SQL muy concretas. Además, si en algún momento se modifican las tablas de la base de datos o se debe variar la secuencia de acciones a realizar sobre ellas, no habrá que variar el código de la aplicación telefónica, sino únicamente el programa en PL/1 residente en el Host, lo cual resulta más sencillo. Hay que señalar que cuando necesitamos ejecutar alguno de estos programas, lo que se hace realmente es invocar en el Host un fichero, similar a los ficheros BAT de MS/DOS, que es el que llama al ejecutable una vez que ha fijado ciertas condiciones, como el fichero de entrada que se va a utilizar o el propio nombre del ejecutable. Esto nos ha permitido no tener que cambiar los programas ejecutables para poder utilizar dos sesiones. 8.7 CREACIÓN DE UN EJECUTABLE A PARTIR DEL CÓDIGO EN PL/1 Para conseguir un programa ejecutable a partir del código fuente programa en PL/1 hay que seguir los siguientes pasos: de un 1.- PREP nombre_fichero Esta instrucción compilará el fichero nombre_fichero, que será un programa en código fuente PL/1, y generará un nuevo fichero, con el mismo nombre, pero con extensión TXT. Este fichero objeto no puede utilizarse directamente, pues muchas de las rutinas predefinidas, como las de entrada/salida de datos, no se encuentran físicamente en él, sino que deben ser incorporadas al mismo. Pág. 8-4 Capítulo 8: Acceso a bases de datos remotas: Host IBM 2.- LOAD nombre_fichero arirvtsc (start Utiliza como nombre_fichero el fichero TXT generado en el punto anterior. Esta instrucción realiza la ‘carga del programa’, es decir, incorpora las rutinas predefinidas necesarias para la ejecución del programa. El parámetro (start es opcional e indica que, una vez finalizada la carga, se ejecute. 3.-GENMOD nombre_ejecutable (from plistart Este comando crea un mandato del sistema cuyo nombre está indicado en nombre_ejecutable. Es útil cuando se desea ejecutar un programa frecuentemente. Generará un fichero de nombre nombre_ejecutable y de extensión MODULE, que contendrá el código máquina necesario para ejecutar el programa. A partir de este momento, el nombre_ejecutable es un comando más de los que se dispone, y sin más que introducirlo desde el terminal comenzará a ejecutarse. 8.8 LA EMULACIÓN 3270 Para comunicarnos con el HOST utilizaremos un programa de emulación 3270 para entorno Windows y nuestro sistema realizará llamadas a una serie de funciones de la API (contenidas en una DLL), con las que conseguiremos interactuar con el HOST, enviando y recibiendo datos del mismo. 8.9 LLAMADA A FUNCIONES DE LA API Dependiendo del lenguaje de programación que se utilice, la llamada variará. En nuestro caso utilizamos el lenguaje C, en el cual la llamada a una función se compone de: • La palabra hllapi: es la función de la DLL que se invoca cuando se quiere ejecutar una función de la API. • Cuatro parámetros: código de la función, cadena de datos, longitud de la cadena de datos y código de retorno. Estos cuatro parámetros se pasan siempre por referencia, y se deben enviar siempre los cuatro, incluso aunque la función no haga uso de todos ellos. Los códigos de función y de retorno y la longitud de la cadena de datos son enteros de dos bytes en todos los lenguajes que soporta la API, y la cadena de datos contiene caracteres, no valores numéricos, tanto si se utiliza para enviar como para recibir datos. Pág. 8-5 Capítulo 8: Acceso a bases de datos remotas: Host IBM A continuación se describen las funciones que desempeñan estos parámetros: • • • • Código de función: valor entero que especifica cuál es la función de la API que se quiere ejecutar. Cada función lleva asociado unívocamente un número que es obligatorio especificar. Cadena de datos: array de caracteres que se usa de diferente forma según la función invocada. Longitud de la cadena de datos: longitud del parámetro anterior. En él se nos puede devolver o no información útil para la aplicación, dependiendo de la función que hayamos invocado. Código de retorno: informa sobre el resultado de la ejecución de la función. Debe ser siempre chequeado por la aplicación para comprobar que la función se ha realizado correctamente. Como parámetro de entrada sirve para especificar, en algunas funciones, la posición en la pantalla del Host en la cual, o a partir de la cual, se desea realizar cierta acción. 8.10 FUNCIONES PREDEFINIDAS En el sistema monolínea se habían implementado como funciones internas. En nuestro caso es necesario implementarlas como funciones predefinidas, pues necesitan una función idle asociada. Estas funciones están orientadas a tareas de búsqueda y recogida de información. A continuación se presenta una breve descripción de estas funciones. Sus diagramas de flujo se encuentran en la Sección PLANOS. • • • IBM_INICIALIZA_BD: se encarga de abrir la conexión con el Host, conectándose al PS (Presentation Space), que es la pantalla del mismo, al que se pueden enviar y del que se reciben datos. La API permite tener abiertas, simultáneamente, diferentes conexiones con diferentes PS, pero no se soporta el acceso simultáneo a ellas. La función no admite parámetros de entrada, y devuelve 0 si la sesión con el Host se inició correctamente, 1 si la sesión ya estaba abierta y un valor negativo si se ha producido algún error. IBM_FINALIZA_BD: función que finaliza la conexión con el Host, realizando el logout de la sesión. No necesita parámetros de entrada ni devuelve ninguno de salida. Devuelve 0 si todo ha funcionado correctamente, 1 si no había una conexión previa, 2 si la conexión no ha podido finalizarse correctamente y un valor negativo si se ha producido algún error. IBM_BUSCA_ELEMENTO: utiliza uno de los programas residentes en el Host para acceder a las bases de datos, extrae la información solicitada, la lee de la pantalla del Host y la almacena en las listas creadas para tal fin. Como parámetros de entrada necesita el DNI o pasaporte, sin caracteres alfabéticos, la CLAVE de acceso, año académico y convocatoria. Devuelve 0 si se ejecutó correctamente, 1 si no hay datos, 2 si el usuario no tiene acceso al servicio y un valor negativo si se ha producido algún error. Pág. 8-6 Capítulo 8: Acceso a bases de datos remotas: Host IBM • • • IBM_LEER_CAMPOS: lee la siguiente calificación sin leer, resultante de la ejecución de la función anterior. No admite ningún parámetro de entrada y los parámetros de salida son las variables en las que se guardarán los datos asociados a la calificación. Devuelve 0 si todo ha funcionado correctamente, 1 si no hay más calificaciones que leer, y un valor negativo si no hubo búsqueda inicial. No tiene función idle asociada. IBM_COMPRUEBA_ALUMNO: Utiliza uno de los programas residentes en el Host para acceder a las bases de datos y comprobar si el usuario está autorizado para acceder al servicio. Como parámetros de entrada requiere el DNI o pasaporte, sin caracteres alfabéticos, y su CLAVE de acceso. No devuelve ningún parámetro de salida. Retorna 0 si el usuario tiene acceso al sistema, 1 si no tiene permiso para utilizar el sistema, y un valor negativo si se ha producido algún error. IBM_CAMBIA_PASSWORD: Utiliza uno de los programas residentes en el Host para acceder a las bases de datos y cambiar la clave de acceso de un usuario del servicio. Como parámetros de entrada requiere el DNI o pasaporte, sin caracteres alfabéticos, su CLAVE de acceso actual y la CLAVE NUEVA. No devuelve ningún parámetro de salida. Retorna 0 si el cambio se realizó correctamente, 1 si la nueva clave no es válida y un valor negativo si se ha producido algún error. Todas estas funciones escriben, en caso de que se produzca algún error en su ejecución, la información relativa al error que se ha producido en un fichero llamado ‘sys_error.txt’, en el directorio en que esté funcionando la aplicación telefónica que utilice estas funciones. Pág. 8-7 Capítulo 8: Acceso a bases de datos remotas: Host IBM 8.11 SERVIDOR DEL HOST Para enviar ficheros al Host ha sido necesario diseñar un servidor, pues esta operación lleva unos dos segundos, tiempo en el que nuestra aplicación quedaría bloqueada. Su arquitectura es idéntica a la descrita para el servidor BDE/IDAPI descrito en el capítulo anterior, por lo que no se repite aquí. En este caso hay detalles adicionales que no estaban presentes en el caso del acceso a bases de datos locales, como los fallos de comunicación, o la no atención por parte del Host remoto en un plazo de tiempo razonable. En estos casos la Librería de Enlace Dinámico (DLL) donde están las funciones que utilizamos presenta un MessageBox indicando la causa del fallo. Como el sistema está pensado para funcionar de manera desatendida, es necesario tratar este MessageBox. La solución adoptada ha sido la siguiente: • • • • • Todas las funciones implementadas, lo primero que hacen en su función idle de segundo nivel es comprobar la presencia del MessageBox. Si una de esas funciones lo detecta, comprueba si es esa línea la responsable de que aparezca, y si es así le envía un retorno de carro, con lo que conseguimos que desaparezca, y retorna un código de error. Para saber si una línea es la responsable de que aparezca (cada línea tiene asignada una sesión de comunicación distinta con el Host, y en el MessageBox no aparece información de la sesión que ha causado el error), se comprueba la existencia del fichero de petición. Si no está presente, indica que el servidor estaba atendiendo su petición, y como el servidor sólo puede estar atendiendo una línea en un momento dado, el MessageBox se debe a esa línea. Si esa línea no es la causante del MessageBox continúa normalmente y no toma ninguna acción. Dada la rapidez con que se itera entre las líneas, el MessageBox, que no bloquea el sistema, se detectará inmediatamente. Hay que tener presente que la línea que envía el retorno de carro para acabar con el MessageBox retorna con un código de error. Es responsabilidad de la aplicación actuar en consecuencia, normalmente expulsando al usuario después de indicarle que se ha producido un fallo en el sistema. De ahí la importancia de identificar la línea que lo ha originado, pues las demás pueden continuar normalmente. En el caso de funciones que no hacen uso del servidor (las que no envían ficheros al Host), le enviará el retorno de carro la primera de las líneas que lo detecte. En este caso, no tenemos un fallo al enviar un fichero, sino un fallo de comunicación genérico, y no es posible saber la sesión que lo ha ocasionado. Pág. 8-8 Capítulo 8: Acceso a bases de datos remotas: Host IBM 8.12 SERVICIO DE NOTAS POR TELEFONO 8.12.1 Introducción Este servicio permite a cualquier alumno autorizado que llame al servicio conocer las calificaciones obtenidas en la última convocatoria de exámenes a través del teléfono y de forma automática. Para ello basta que el alumno introduzca su DNI o PASAPORTE y una CLAVE de acceso y el sistema, tras comprobarlos, proporcionará todas sus notas disponibles, indicando la asignatura y la calificación obtenida. El sistema soporta tanto reconocimiento de voz como detección de tonos multifrecuencia (DTMF), maneja un vocabulario compuesto por los dígitos del cero al nueve y las palabras si, no, ayuda y cancelar, y es capaz de reconocer cadenas de dígitos de una longitud determinada. Para enviar mensajes al usuario se utiliza la reproducción de mensajes pregrabados, por su mayor calidad, siempre que esto sea posible. También se utiliza la conversión texto-habla para sintetizar palabras cortas que dependen del usuario, como por ejemplo su nombre. 8.12.2 Funcionamiento Cuando el sistema detecta una llamada descuelga y manda un mensaje de bienvenida al usuario, al que se le da la posibilidad de escuchar una serie de mensajes de ayuda sobre el funcionamiento del sistema. A continuación el sistema pedirá al usuario su DNI o número de PASAPORTE, que deberá introducir dígito a dígito (si su longitud es inferior a 8 dígitos deberá decir cancelar después del último dígito). El proceso anterior se repetirá con la CLAVE de acceso, que en este caso es una cadena de 4 dígitos. En este momento el sistema comprobará que el usuario tiene acceso al servicio, saludando al usuario y presentando el menú principal, dándole opción a conocer sus calificaciones, cambiar su CLAVE de acceso o finalizar la llamada. Si decide cambiar la CLAVE, se le pedirá la nueva clave. Después de realizar el cambio, si ha sido posible, se vuelve a presentar el menú principal. Si el usuario decide escuchar sus calificaciones, el sistema las buscará en la base de datos del Host y le irá informando de las calificaciones obtenidas en las diferentes asignaturas. Si no hubiera ninguna calificación disponible se informaría al alumno de ello. Tras leer todas las calificaciones, el sistema despide al usuario con un mensaje de despedida. Pág. 8-9 Capítulo 8: Acceso a bases de datos remotas: Host IBM A continuación se muestra el diagrama de bloques de la aplicación. El diagrama de la subrutina VerifCad, encargada de verificar cadenas, se puede ver en el Apéndice A Manual del Usuario. Pág. 8-10 Capítulo 8: Acceso a bases de datos remotas: Host IBM Pág. 8-11 Capítulo 8: Acceso a bases de datos remotas: Host IBM Pág. 8-12 Capítulo 8: Acceso a bases de datos remotas: Host IBM Pág. 8-13 Capítulo 8: Acceso a bases de datos remotas: Host IBM Pág. 8-14 Capítulo 8: Acceso a bases de datos remotas: Host IBM Pág. 8-15 Capítulo 8: Acceso a bases de datos remotas: Host IBM Pág. 8-16 Capítulo 8: Acceso a bases de datos remotas: Host IBM Pág. 8-17 Capítulo 8: Acceso a bases de datos remotas: Host IBM 8. ACCESO A BASES DE DATOS REMOTAS: HOST IBM .............................. 8-1 8.1 INTRODUCCIÓN...................................................................................................8-1 8.2 EL SISTEMA OPERATIVO VM/SP .....................................................................8-1 8.3 PROGRAMAS RESIDENTES EN EL HOST .......................................................8-2 8.4 MENSAJES DEL SISTEMA ..................................................................................8-2 8.5 COMENZANDO Y FINALIZANDO UNA SESIÓN CON EL HOST..................8-3 8.6 ACCESO A LAS BASES DE DATOS DEL HOST ...............................................8-3 8.6.1 8.6.2 Mediante comandos SQL introducidos directamente por el usuario............................... 8-3 Utilizando programas escritos en PL/1.......................................................................... 8-4 8.7 CREACIóN DE UN EJECUTABLE A PARTIR DEL CóDIGO EN PL/1 ...........8-4 8.8 LA EMULACIóN 3270 ...........................................................................................8-5 8.9 LLAMADA A FUNCIONES DE LA API ..............................................................8-5 8.10 FUNCIONES PREDEFINIDAS .........................................................................8-6 8.11 SERVIDOR DEL HOST.....................................................................................8-8 8.12 SERVICIO DE NOTAS POR TELEFONO.......................................................8-9 8.12.1 8.12.2 Introducción................................................................................................................. 8-9 Funcionamiento ........................................................................................................... 8-9 Pág. 8-18