Provisioning


Servicio de Windows que realiza el aprovisionamiento de una base de datos para un dispositivo, Filtra la Base de Datos del servidor completa, siguiendo las directrices de selectividad que dicho dispositivo tenga definidas (Master_Replica_Selected).
Como requisito, debe de tener conectividad con la base de datos del cliente.

La creación de la base de datos, se puede realizar de dos formas:

Petición por parte del dispositivo, cuando se realiza la primera instalación de la aplicación mediante el xonelive.
Provisión de una base de datos desde el xonemanager.


En ambos casos, se crea una actualización para la licencia implicada en la misma, en la estructura de carpetas del xonelive, para que se la descargue el dispositivo.

El servicio XOne Provisioning tiene asociadas tres tablas, ADM_PROVISIONING_TASK, ADM_PROVISIONING_LOGS Y ADM_PROVISIONING_TABLES, para crear una nueva tarea de provisionamiento a un dispositivo, logs de la provisión y orden de provisionamiento de las tablas respectivamente.

A continuación podemos ver unas capturas de pantalla de las dos primeras tablas:

1.- ADM_PROVISIONING_TASK. Aquí se da de alta un registro con STATUS=0, el servicio xoneprovisioning está monitorizando esta tabla en busca de nuevos registros, cuando encuentra uno, lo marca con STATUS=1 y le actualiza el campo STARTED con la fecha en la que comienza la provisión, posteriormente cuando esta finaliza, pone el STATUS=2 y en el campo RESULT pondrá si ha finalizado con error, o si todo ha finalizado correctamente, en el campo USERDATA pondrá la versión de actualización que ha puesto en la estructura de carpetas del xonelive para que el dispositivo se descargue la Base de Datos generada.
adm_provisioning_task.jpg
2.- En la tabla ADM_PROVISIONING_LOGS, podremos hacer un seguimiento de la provisión asociada a la tarea que dimos de alta en la tabla anterior. Filtrando por IDTASK y ordenando por ID ASC, podremos ver las tablas que va provisionando. Para más información en caso de errores de provisión, habría que activar el log en el fichero de configuración del servicio y mirar en el visor de sucesos.
adm_provisioning_logs.jpg


El fichero de configuración Provisioning.Config se encuentra en la carpeta donde se encuentre el servicio xoneprovisioning.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
	<appSettings>
 
		<!-- Maximo numero de BD que pueden crearse de forma simultanea --> 
		<add key="MaxProvisioningProcesses" value="1" />
 
		<!-- Ruta de donde coge los after-action para cada plataforma. 
		Esta carpeta, debe existir OBLIGATORIAMENTE y dentro tiene que tener las carpetas de cada plataforma.
		Hay que darle permisos al SERVICIO DE RED sobre la carpeta. Si no se cumplen estas condiciones, ERROR --> 
		<add key="RepositoryPath" value="D:\XOneRepository\Provisioning" />
 
		<!-- Ruta donde pone las actualizaciones  -->
		<add key="XoneLivePath" value="D:\XOneRepository\Updates" />
 
		<!-- Esto es para evitar el reparseo de la selectividad (Por defecto, false) Ver Apartado más abajo... -->
		<add key="Using-SubQueries" value="false" />
 
		<!-- Esto es para generar base de datos de pc. -->
		<add key="dbms-Windows32" value="SQL SERVER FECHA-ESP" />
 
		<!-- Para poner log, 0=No log, 5=Máximo nivel de log. Revisar tanto ADM_PROVISIONING_LOGS, como el VISOR DE SUCESOS -->
		<add key="LogLevel" value="5" />
 
	</appSettings>
	<connectionStrings>
 
		<!-- Conexiones a las bases de datos de Sistema (XOneManager), SUSTITUIR el providerName si es Mysql, Oracle... -->
		<add name="XoneConnectionString" connectionString="Persist Security Info=False;database=xonemanager;server=127.0.0.1;user id=ELQUESEA;Password=LAQUESEA" providerName="System.Data.SqlClient" />
		<add name="xonemanagerCnnStr" connectionString="Persist Security Info=False;database=xonemanager;server=127.0.0.1;user id=ELQUESEA;Password=LAQUESEA" providerName="System.Data.SqlClient" />
 
		<!-- NAME tiene que ser igual al campo NUMERO de la tabla ADM_DATABASES del XOneManager. -->
		<add name="00000001" connectionString="Data Source=127.0.0.1;Initial Catalog=BDQUESEA;Persist Security Info=True;User ID=ELQUESEA;Password=LAQUESEA" providerName="System.Data.SqlClient" />
		<add name="80000001" connectionString="Persist Security Info=False;database=BDQUESEA;server=127.0.0.1;user id=ELQUESEA;Password=LAQUESEA;port=3310" providerName="MySql.Data.MySqlClient" />
		<add name="80000002" connectionString="Persist Security Info=False;database=BDQUESEA;server=127.0.0.1;user id=ELQUESEA;Password=LAQUESEA;port=3310" providerName="MySql.Data.MySqlClient" />
	</connectionStrings>
</configuration>

Número máximo de Procesos de Provisionamiento activos al mismo tiempo. (Si hubiera más de 1, se crea una cola)

Ruta donde se encuentra la estructura de carpetas del Provisioning.

  1. La carpeta especificada debe existir.
  2. Debe ser una ruta con permisos para el SERVICIO DE RED.
  3. Dentro de ésta carpeta estará la estructura de carpetas correspondiente a las distintas plataformas del proyecto. (Android, Iphone…)


Ruta donde finalmente se ponen las actualizaciones (Ruta del xonelive)

Para dejar log en el Visor de Sucesos de los errores que se puedan producir y en ADM_PROVISIONING_LOGS.
Los valores son 0 para NO dejar log y 5 para que se haga log de todo.


Este atributo (Por defecto a false), se pondrá a true cuando la condición de la tabla master_replica_selected (CRITERIA) sea muy enrevesada e imparseable, creando una subquery de la condición y no parseandola directamente, de forma que dejará de dar errores de parseo.

Si se pone a true, se utiliza una subquery, que NO provocará error al hacer el parseo del CRITERIA, pero la SQL será más lenta…

Ejemplo con Using-subqueries=true:

SELECT * FROM tabla WHERE rowid IN ( subselect CRITERIA )

Además, existe también una posibilidad, únicamente cuando se utiliza el Using-subqueries=true, y es crear un campo en MASTER_REPLICA_SELECTED llamado CRITERIAPROVISIONNING, en el cual podríamos definir la sql que se va a lanzar directamente, saltándonos la sql que haya definida en la selectividad. Esta SQL rescataría TODOS los datos de la tabla en cuestión y NO únicamente el ROWID.
Si este campo CRITERIAPROVISIONNING estuviese vacío, se coge lo que esté definido en el CRITERIA de la selectividad, siempre que tengamos el ALWAYS=0.


Como a día de hoy, la base de datos a generar es SQLite, necesitaremos tener instaladas en el servidor las librerías necesarias para poder generar bases de datos en este formato.

Descargamos las librerías para SQLite de la página: http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

En principio, la descarga que nos interesa es la que haya en los apartados:

Setups for 32-bit Windows (.NET Framework 4.5)
Setups for 64-bit Windows (.NET Framework 4.5)


Copiamos las DLL que nos haya instalado en la carpeta “C:\Program Files\System.Data.SQLite\2010\GAC”, dentro de la carpeta del xoneprovisioning.


A partir de la versión 2.1.2.5 del XOne Provisioning, se han realizado optimizaciones y modificaciones para aprovechar las mejoras de la última versión del conector .NET de Sqlite, de forma que los tiempos de generación de una base de datos para los dispositivos se reducen de forma considerable.



Errores Frecuentes
1.- Si el servicio es reiniciado mientras se estaba efectuando una provisión (campo STATUS=1 en ADM_PROVISIONING_TASK), el servicio queda en un estado “zombie”, hay que parar el servicio y poner el STATUS=0. Se arranca el servicio, se vuelve a provisionar, y problema resuelto.

2.- La ruta definida en el repositorypath no tiene permisos para el SERVICIO DE RED o no tiene la estructura de carpetas correcta dentro de ésta.

El síntoma será que nos creará el registro en la tabla ADM_PROVISIONING_TASK pero no llegará a procesarse por el servicio.

3.- Si en el servidor se ha utilizado algún tipo de dato muy específico de un DBMS, puede haber problemas a la hora de convertir dicho dato a SQLite, revisar las conversiones de datos en el fichero EXPDBMS.XML de la carpeta del provisioning, que será donde están definidas las conversiones entre tipos de datos. (Este mismo fichero lo utiliza el XOne Studio para generar la BD cuando estamos desarrollando).
4.- Si el dispositivo tiene operaciones pendientes de procesarse en la tabla MASTER_REPLICA_IQUEUE, tampoco comenzará a procesarse el registro de la tabla ADM_PROVISIONING_TASK .