Dieses Beispiel implementiert den dateibasierten Download für die zeitstempelbasierte Synchronisation.
Die folgenden Befehle erstellen die drei in dem Beispiel verwendeten Datenbanken, nämlich eine konsolidierte Datenbank, eine entfernte Datenbank und eine Dateidefinitions-Datenbank.
dbinit tcons.db dbinit tremote.db dbinit tfdef.db
Die folgenden Befehle starten die drei Datenbanken, erstellen einen Datenquellennamen, den MobiLink verwendet, um sich mit der konsolidierten Datenbank zu verbinden, und starten den MobiLink-Synchronisationsserver.
dbeng9 -n tfdef_eng tfdef.db dbeng9 -n tcons_eng tcons.db dbeng9 -n tremote_eng tremote.db dbdsn -y -w tfbd_demo -c "eng=tcons_eng;dbf=tcons.db;uid=dba; pwd=sql;astart=off;astop=off" start dbmlsrv9 -v+ -c "dsn=tfbd_demo" -zu+ -ot tcons.txt
In diesem Beispiel enthält die konsolidierte Datenbank eine einzige Tabelle namens T1. Nach der Verbindungserstellung zur konsolidierten Datenbank können Sie folgenden Code ausführen, um Tabelle T1 zu erstellen:
CREATE TABLE T1 ( pk INTEGER PRIMARY KEY, c1 INTEGER, last_modified TIMESTAMP DEFAULT TIMESTAMP );
Der folgende Code legt eine Skriptversion namens "normal" mit einer minimalen Anzahl an Skripten fest. Diese Skriptversion wird für Synchronisationen verwendet, die keinen dateibasierten Download verwenden.
CALL ml_add_table_script( 'normal', 'T1',
'upload_insert',
'INSERT INTO T1( pk, c1) VALUES( ?, ? )' );
CALL ml_add_table_script( 'normal', 'T1',
'upload_update',
'UPDATE T1 SET c1 = ? WHERE pk = ? ' );
CALL ml_add_table_script( 'normal', 'T1',
'upload_delete',
'DELETE FROM T1 WHERE pk = ?' );
CALL ml_add_table_script( 'normal', 'T1',
'download_cursor',
'SELECT pk, c1 FROM T1 WHERE last_modified >= ?' );Der folgende Code setzt die Generierungsnummer für alle Subskriptionen auf 1. Es wird empfohlen, Generierungsnummern zu verwenden, falls Ihre konsolidierte Datenbank verloren geht oder beschädigt wird und Sie einen Upload durchführen müssen.
CREATE PROCEDURE begin_pub (
INOUT generation_num integer,
IN username varchar(128),
IN pubname varchar(128) )
BEGIN
SET generation_num = 1;
END;
CALL ml_add_connection_script( 'normal',
'begin_publication',
'{ call begin_pub( ?, ?, ? ) }' );
COMMIT;Der folgende Code legt die Skriptversion namens "filebased" fest. Diese Skriptversion wird für die Erstellung dateibasierter Downloads verwendet.
CALL ml_add_connection_script( 'filebased',
'begin_publication',
'{ call begin_pub( ?, ?, ? ) }' );
CALL ml_add_table_script( 'filebased', 'T1',
'download_cursor',
'SELECT pk, c1 FROM T1 WHERE last_modified >= ?' );Der folgende Code setzt die letzte Download-Zeit fest, sodass alle Änderungen, die innerhalb der letzten fünf Tage vorgenommen wurden, in Download-Dateien einbezogen werden. Jede entfernte Datenbank, die keine der in den letzten fünf Tagen erstellten Download-Dateien übernommen hat, muss eine normale Synchronisation ausführen, bevor sie weitere dateibasierte Downloads übernehmen kann.
CREATE PROCEDURE ModifyLastDownloadTimestamp(
INOUT last_download_timestamp TIMESTAMP,
IN ml_username VARCHAR(128) )
BEGIN
SELECT dateadd( day, -5, CURRENT TIMESTAMP )
INTO last_download_timestamp;
END;
CALL ml_add_connection_script( 'filebased',
'modify_last_download_timestamp',
'CALL ModifyLastDownloadTimestamp( ?, ? )' );
COMMIT;In diesem Beispiel enthält die entfernte Datenbank eine einzige Tabelle namens T1. Wenn Sie eine Verbindung zur entfernten Datenbank hergestellt haben, führen Sie den folgenden Code aus, um die Tabelle T1, eine Publikation namens P1 und einen Benutzer namens U1 zu erstellen. Der Code erstellt außerdem für U1 eine Subskription von P1.
CREATE TABLE T1 (
pk INTEGER PRIMARY KEY,
c1 INTEGER
);
CREATE PUBLICATION P1 (
TABLE T1
);
CREATE SYNCHRONIZATION USER U1;
CREATE SYNCHRONIZATION SUBSCRIPTION
TO P1
FOR U1;Der folgende Code definiert die gespeicherte Prozedur sp_hook_dbmlsync_validate_download_file. Diese gespeicherte Prozedur verhindert, dass Download-Dateien übernommen werden, in denen die Zeichenfolge OK nicht enthalten ist.
CREATE PROCEDURE sp_hook_dbmlsync_validate_download_file()
BEGIN
DECLARE udata varchar(256);
SELECT value
INTO udata
FROM #hook_dict
WHERE name = 'user data';
IF udata <> 'ok' THEN
UPDATE #hook_dict
SET value = 'FALSE'
WHERE name = 'apply file';
END IF;
ENDDer folgende Code definiert die Dateidefinitions-Datenbank für das Zeitstempelbeispiel. Er erstellt eine Tabelle, eine Publikation, einen Benutzer und eine Publikationssubskription für den Benutzer.
CREATE TABLE T1 (
pk INTEGER PRIMARY KEY,
c1 INTEGER
);
CREATE PUBLICATION P1 (
TABLE T1
);
CREATE SYNCHRONIZATION USER G1;
CREATE SYNCHRONIZATION SUBSCRIPTION
TO P1
FOR G1;Sie müssen Ihre neue entfernte Datenbank für die Übernahme einer Download-Datei vorbereiten, indem Sie entweder eine normale Synchronisation ausführen oder die Download-Datei mit der dbmlsync-Option -bg erstellen. Dieses Beispiel veranschaulicht die Verwendung von -bg.
Der folgende Code definiert eine Skriptversion namens filebased_init für die konsolidierte Datenbank. Diese Skriptversion hat ein einziges begin_publication-Skript.
CALL ml_add_table_script(
'filebased_init', 'T1', 'download_cursor',
'SELECT pk, c1 FROM T1' );
CALL ml_add_connection_script(
'filebased_init',
'begin_publication',
'{ call begin_pub( ?, ?, ? ) }' );
COMMIT;Die beiden folgenden Befehlszeilen erstellen eine Download-Ausgangsdatei, die die Skriptversion filebased_init und die Option -bg verwendet.
dbmlsync -c "uid=dba;pwd=sql;eng=tfdef_eng;dbf=tfdef.db" -v+ -e "sv=filebased_init" -bc tfile1.df -be ok -bg -ot tfdef1.txt dbmlsync -c "uid=dba;pwd=sql;eng=tremote_eng;dbf=tremote.db" -v+ -ba tfile1.df -ot tremote.txt
Stellen Sie eine Verbindung zur konsolidierten Datenbank her und fügen Sie Daten ein, die durch einen dateibasierten Download synchronisiert werden, wie im folgenden Beispiel:
INSERT INTO T1(pk, c1) VALUES( 1, 1 ); INSERT INTO T1(pk, c1) VALUES( 2, 4 ); INSERT INTO T1(pk, c1) VALUES( 3, 9 ); commit;
Die folgende Befehlszeile erstellt eine Download-Datei, die die neuen Daten enthält.
dbmlsync -c "uid=dba;pwd=sql;eng=tfdef_eng;dbf=tfdef.db" -v+ -e "sv=filebased" -bc tfile2.df -be ok -ot tfdef2.txt
Die folgende Befehlszeile übernimmt eine Download-Datei in die entfernte Datenbank.
dbmlsync -c "uid=dba;pwd=sql;eng=tremote_eng;dbf=tremote.db" -v+ -ba tfile2.df -ot tfdef3.txt
Die Änderungen werden nun in die entfernte Datenbank übernommen. Öffnen Sie Interactive SQL, verbinden Sie sich mit der entfernten Datenbank und führen Sie den folgenden SQL-Befehl aus, um zu überprüfen, ob die entfernte Datenbank die Daten enthält:
SELECT * FROM T1
Die folgenden Befehle stoppen alle drei Datenbank-Engines und löschen dann die Dateien.
del file1.df dbmlstop -h -w dbstop -y -c eng=tfdef_eng dbstop -y -c eng=tcons_eng dbstop -y -c eng=tremote_eng dberase -y tfdef.db dberase -y tcons.db dberase -y tremote.db
SQL Anywhere Studio 9.0.1
Copyright © 1989–2004 Sybase Inc. Teil-Copyright © 2001–2004 iAnywhere Solutions Inc. Alle Rechte vorbehalten.