Personalizar y Ampliar la Funcionalidad de las Bases de Datos

A continuación encontrarás traducido al castellano el artículo escrito por Gabriel Ludosanu y publicado originalmente en el Blog oficial de Xojo.

¿Te has encontrado alguna vez depurando una app de bases de datos de Xojo y te has preguntado sobre las consultas SQL ejecutadas y los parámetros utilizados? No estás solo. Tanto si estás desarrollando una app desktop, como web o para dispositivos móviles, tener una visión clara de las interacciones con la base de datos es crucial para la depuración eficaz y garantizar que tu app funciona correctamente.

Este artículo te mostrará como registrar automáticamente las consultas y comandos en cualquier clase de base de datos de Xojo, de modo que puedas depurar y mejorar las operaciones sobre la base de datos mediante el uso de la sobre-escritura de métodos o, en inglés, Method Overriding. Esto te ayudará a:

  • Depurar las operaciones SQL con mayor rapidez al ver exactamente lo que se está ejecutando.
  • Encontrar los errores en las consultas SQL o los parámetros antes de que deriven en problemas durante el tiempo de ejecución.
  • Obtener una mayor transparencia sobre el comportamiento de la base de datos de tu app.

Al final de este tutorial tendrás una mayor comprensión de:

  • Sobre-escritura de métodos: qué es y como puedes usarlo para ampliar las clases incluidas en Xojo.
  • Crear subclases a partir de las clases de bases de datos: aprenderás a desarrollar clases de bases de datos personalizadas con funcionalidades de logado adicionales para mejorar el seguimiento y gestión de la base de datos,.
  • Logado de los comandos SQL y sus parámetros: descubrirás cuan eficaz resulta capturar y registrar las operaciones sobre la base de datos en el uso de SELECT, INSERT y DELETE para mejorar la visibilidad y mejorar el rendimiento de la base de datos.

¿Qué es la sobre-escritura de métodos?

La sobre-escritura de métodos, concepto fundamental en la programación orientada a objetos (OOP), te permite personalizar el modo en el que una subclase implementa los métodos de su clase padre. En Xojo, es una característica potente que te permitirá, entre otras cosas, mejorar las clases incorporadas sin necesidad de tener que modificar el código original, asegurando así que se mantiene la funcionalidad definida al tiempo que añades tus propias capacidades o comportamiento adicional.

Cómo funciona la sobre-escritura de métodos en Xojo

Veámoslo paso a paso mediante un ejemplo sencillo. Imagina que estás trabajando con la clase de base de datos SQLiteDatabase, y que quieres modificar el comportamiento de su método ExecuteSQL para registrar cada uno de los comandos SQL ejecutados.

Crear una Subclase:

Crea una nueva clase en Xojo y define su Super a SQLiteDatabase. Esto significa que tu nueva subclase hereda todas las propiedades, métodos y eventos de SQLiteDatabase.

Sobre-escribe el método:

En tu nueva subclase, define un método y en el campo Method Name, selecciona ExecuteSQL. Añade la lógica personalizada que desees, como registrar el comando SQL sobre el depurador de Xojo.

Llama al método original:

Utiliza la palabra clave Super para llamar al método ExecuteSQL original de la clase padre en la que se basa nuestra subclase. Esto garantiza que se ejecute el comportamiento original al tiempo que también se ejecuta la lógica personalizada.

Ampliar la clase SQLiteDatabase de Xojo con Sobre-escritura de métodos

Mejoremos la clase SQLiteDatabase de Xojo creando una subclase que registre automáticamente las peticiones SELECT y sus parámetros. Para lograr que este proceso sea más sencillo, utiliza el proyecto de ejemplo incluido de serie “Full-Text Seaching 5”, el cual ya incluye varias operaciones con la base de datos.

1. Crea la subclase MySQLiteDatabase

  • En el menú Insert, selecciona Class.
  • Nombra la nueva clase como MySQLiteDatabase.
  • En el panel Inspector, define el campo Super a SQLiteDatabase.

Esto indica a Xojo que MySQLiteDatabase heredará el comportamiento de la clase SQLiteDatabase, permitiéndote así sobre-escribir sus métodos.

2. Sobre-escribe el método SelectSQL

Ahora sobre-escribirás el método SelectSQL en tu clase MySQLiteDatabase. Este método es el utilizado por las peticiones SELECT, de modo que añadirás un logado para mostrar la petición junto con sus parámetros en el depurador.

Public Function SelectSQL(query As String, ParamArray values() As Variant) As RowSet
  // Log the SELECT query
  System.DebugLog("[DEBUG] SelectSQL called: " + query)
  
  // Log the parameters (if any)
  If values.LastIndex >= 0 Then
    Var stringValues() As String
    For Each v As Variant In values
      stringValues.Add(v.StringValue) // Convert Variant to String
    Next
    System.DebugLog("[DEBUG] Parameters: " + String.FromArray(stringValues, ", "))
  End If
 
  // Call the original SelectSQL method
  Try
    Return Super.SelectSQL(query, values)
  Catch error As DatabaseException
    // Log any errors
    System.DebugLog("[ERROR] DatabaseException: " + error.Message)
    Raise error // Re-raise the exception so the app can handle it
  End Try
End Function

3. Sustituye la Propiedad Database

Ahora que has creado la subclase MySQLiteDatabase, tendrás que actualizar el proyecto de ejemplo para que la use.

  • Abre Window1 en el Navegador del Proyecto.
  • Ubica la propiedad DB en Window1. Actualmente estará definida como DB As SQLiteDatabase:
  • Cambia el tipo de DB de SQLiteDatabase a MySQLiteDatabase. Para ello:
  • Selecciona la propiedad DB.
  • En el Inspector, actualiza el campo Type a MySQLiteDatabase.
  • Adicionalmente, bajo el evento Opening de Window1, cambia DB = New SQLiteDatabase por DB = New MySQLiteDatabase.

Las anteriores acciones sustituirán el tipo SQLiteDatabase original por el de tu propia subclase, asegurando que todas las operaciones de la base de datos utilicen el método SelectSQL que hemos sobre-escrito.

4. Probar el Logado

Con la subclase ya definida, ejecuta el proyecto y prueba la funcionalidad de registro.

Ejecuta el Proyecto.

Realiza una búsqueda en la UI de la app. Cada búsqueda genera una petición SELECT utilizando para ello el método SelectSQL.
Consulta el Panel de Mensajes para comprobar la salida producida. Deberías de ver cada consulta SQL junto con sus parámetros.

Salida de Ejemplo

[DEBUG] SelectSQL called: SELECT highlight(ftstest, 0, '<', '>') FROM ftstest WHERE ftstest MATCH 'know' ORDER BY rank;

Mejoras Adicionales

Ahora que has creado los pilares para ampliar las clases de bases de datos de Xojo mediante el registro de las peticiones con tu subclase personalizada, puedes pensar en otras formas de ampliar sus capacidades aun más. A continuación te muestro algunas ideas de mejoras adicionales que harán que tu subclase sea más robusta, versátil y útil tanto para las labores de depuración como para el monitoreo de su rendimiento.

Logado de métodos adicionales

Si bien hemos empezado con el método SelectSQL, tu app puede realizar otras operaciones con la base de datos, como INSERT, UPDATE, DELETE o incluso transacciones. Puedes sobre-escribir estos métodos como ExecuteSQL para que registre sus operaciones junto con sus parámetros. Al ampliar la funcionalidad de logado en estos métodos clave garantizarás disponer de una imagen más completa sobre toda la actividad de la base de datos.

Adicionalmente, al registrar los métodos de transacciones, como BeginTransaction, CommitTransaction y RollbackTransaction, te permitirá hacer un mejor seguimiento sobre los cambios realizados en la base de datos a la hora de asegurar la integridad de los datos.

Consejo: puedes incorporar el proyecto Log4Xojo.

Soporte de múltiples clases de Bases de datos

Si tu app utiliza diferentes tipos de bases de datos, como pueda ser MySQLCommunityServer o PostgreSQLDatabase, puedes generalizar la funcionalidad de tu logado para que trabaje con todas ellas. Esto se puede hacer creando una clase base de logado que herede de la clase Database, ampliándola luego para cada uno de los tipos de bases de datos específicos. Este enfoque garantiza consistencia y su reutilización entre diferentes sistemas de bases de datos.

Monitoreo del rendimiento en las peticiones

Hacer un seguimiento del tiempo requerido en la ejecución de las peticiones puede proporcionarte una valiosa información sobre el rendimiento de tu aplicación. Al medir la duración de cada petición puedes identificar las peticiones lentas y optimizarlas para mejorar la eficiencia. Además, podrías guardar en el registro una advertencia sobre aquellas peticiones cuya cantidad de tiempo de ejecución superen un nivel determinado, ayudándote así a identificar problemas de rendimiento en la fase inicial.

Intentar automáticamente peticiones fallidas

En algunos casos, las operaciones con las bases de datos pueden fallar debido a problemas transitorios, como por ejemplo interrupciones en la red o bien tablas bloqueadas temporalmente. Mediante la implementación de una lógica que reintente las peticiones fallidas puede hacer que tu app sea más resistente ante los fallos. Por ejemplo, puedes indicar que se reintente una operación hasta un máximo de tres veces antes de registrarla como fallo. Esto resulta particularmente útil en aquellas aplicaciones que utilicen bases de datos remotas, donde es más probable que ocurran fallos debidos a la interrupción en las comunicaciones.

Añadir metadatos específicos al contexto

Mediante la inclusión de metadatos adicionales sobre el contexto en tus registros hará que estos resulten más informativos. Por ejemplo, podrías registrar:

  • El nombre del método o función que ha lanzado la petición.
  • El ID del usuario o el ID de la sesión (si se aplica) para trazar la actividad específica del usuario sobre una base de datos.
  • Uso de etiquetas para agrupar transacciones o peticiones relacionadas.

Este tipo de metadatos hace que resulte más sencillo comprender el “por qué” tras una petición y no sólo el “qué”.

Conclusiones

¡Enhorabuena! Hemos revisado en profundidad una de las técnicas más potentes en el desarrollo con Xojo: ampliar las clases incluidas de serie, como SQLiteDatabase, para que se ajusten a tus necesidades concretas. Al seguir los pasos de este tutorial has aprendido a sobre-escribir métodos, crear subclases de bases de datos personalizadas, y a registrar las peticiones SQL para mejorar las tareas de depuración y la transparencia sobre su funcionamiento.

¿Qué hacer a continuación?

Si te ha gustado este tutorial, nos encantaría conocer tus comentarios. Comparte tus opiniones, personalizaciones o retos con los que te has encontrado en los foros de Xojo. Si estás creando algo increíble con esta técnica, ¡nos encantaría que lo compartieras!

Sigue programando, continúa innovando y, como siempre, ¡feliz desarrollo con Xojo! 🚀

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *