Acerca de los componentes RDBMSResolver y XUpdateResolver

Antes de empezar a publicar el tutorial que tenía pensado para estos días he creido conveniente hablar un poco sobre estos componentes de los cuales veo poca información por la red.

Los componentes RDBMSResolver y XUpdateResolver son los encargados de ¿resolver¿ los cambios en los datos que tengamos en un DataSet. El DataSet siempre actuará como un centralizador de datos y será este el que los mande a un componente visual (como el DataGrid o un ComboBox), reciba los datos de un Conector o como es el caso propague los cambios realizados a un Resolver.

Por su parte los Resolver sirven para notificar a la fuente de datos los cambios realizados:

RDBMSResolver El RDBMSResolver actúa sobre una base de datos típica.
XUpdateResolver El XUpdateResolver lo hace sobre una fuente XML y utiliza un formato llamado Xupdate.

A continuación se muestran dos ejemplos de estos XML. El primero corresponde a un UpdatePacket generado por un RDBMSResolver:

< ?xml version="1.0"?>
  <update_packet tableName="agenda" nullValue="{_NULL_}" transID="IID93068596581:Wed Feb 18 21:32:39 GMT+0100 2004">
    <delete id="IID42980226176">
      <field name="id" type="Number" oldValue="2" key="true" />
      <field name="nombre" type="String" oldValue="Lucas" key="true" />
      <field name="mail" type="Null" oldValue="undefined" key="true" />
    </delete>
    <insert id="IID42909942009">
      <field name="id" type="Number" newValue="4" key="true" />
      <field name="nombre" type="String" newValue="Pepe" key="true" />
    </insert>
    <update id="IID95928000985">
      <field name="id" type="Number" oldValue="3" key="true" />
      <field name="nombre" type="String" oldValue="Enc" newValue="Encar" key="true" />
      <field name="mail" type="Null" oldValue="undefined" key="true" />
    </update>
  </update_packet>

Y este otro es un ejemplo de una modificación en XUpdate generada por un XUpdateResolver:

< ?xml version="1.0"?>
<xupdate :modifications version="1.0" xmlns : xupdate="http://www.xmldb.org/xupdate">
  </xupdate><xupdate :update select="/datapacket/row[@id=&apos;4&apos; ]/@rate"> 452.5 </xupdate>
  <xupdate :update select="/datapacket/row[@id=&apos;3&apos; ]/@duration"> 27.75 </xupdate>

En el caso del RDBMSResolver, todos los inserts, updates y deletes llevan un ID así como el nodo principal tiene un transID. Estos sirven para decirle al DataSet el resultado de los cambios realizados. Por eso se utilizarán luego para formar el XML con los resultados de las operaciones que se devolverán en el resultpacket, pues el DataSet espera esa información.

Lo interesante de estos XML es precisamente eso…que son XML y eso quiere decir que (como veremos luego en nuestro ejemplo) podemos mandar el XML generado por el RDBMSResolver al servidor con OpenAMF y que este los transforme de un XML de Flash a un Document(org.w3c.dom.Document) de Java y a partir de aquí parsearlos y construir las sentencias SQL necesarias para tratar con nuestra base de datos.

El comportamiento de ambos Resolvers es muy similar, ambos tienen las siguientes propiedades:

  • DeltaPacket: Es un objeto creado por el Dataset para reflejar cambios en sus datos.
  • UpdatePacket o XUpdatePacket: Es el DeltaPacket en Formato XML.
  • UpdateResult: Otro XML con los resultados de los cambios realizados por la parte servidora en la base de datos y que sirve para informar al cliente de lo ocurrido con las operaciones realizadas.

Si utilizamos DataBinding podremos ligar los DeltaPacket del DataSet y el Resolver correspondiente, y luego comunicar el updatepacket (o xupdatepacket) al conector que lo mandará al servidor (u otra fuente).

El método que tendremos que utilizar siempre antes de hacer la transmisión será
dataSet_ds.applyUpdates() para dar a entender que hemos realizado todos los cambios que queríamos y que ya se pueden propagar en la base de datos, pues es en este punto cuando se genera el Deltapacket.

Por último tenemos que devolver al DataSet información con lo ocurrido. Para ello debemos crear un resultpacket. Si no hay errores el nuevo XML a mandar debería ser algo del estilo a:

<results_packet transID="IID93068596581:Wed Feb 18 21:32:39 GMT+0100 2004">

En caso de mandar más información de la anterior significa que algo ha salido mal:

</results_packet><results_packet transID="IID93068596581:Wed Feb 18 21:32:39 GMT+0100 2004">
  <operation op="delete" id="IID42980226176" msg="Registro no encontrado" />
  <operation op="insert" id="IID42909942009">
    <field name="id" curValue="8"/>
  </operation>
  <operation op="update" id="IID95928000985">
    <field name="nombre" msg="Valor de campo incorrecto" />
  </operation>
</results_packet>

En este ejemplo el delete y el update han fallado, (y deben tener un atributo msg)
Y el insert se a realizado correctamente(el atributo curValue indica el valor más reciente en el servidor).

Después de esta breve introducción os recomiendo leer los siguientes artículos, que te pueden ayudar como lo hicieron conmigo:

Si conoceis más fuentes al respecto, no dudeis de dejarlas en los comentarios. Y en breve espero postear un ejemplo con OpenAMF.

Gracias por leerme y un saludo.

C.

2 Comentarios

  1. Lo primero queria felicitarte por tu trabajo y por la web que es de gran ayuda. Ya de flash una duda,has conseguido pasar XML a java a traves de OpenAMF?Yo siempre obtengo un error… Gracias

Deja un comentario

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