Delta

Mit Hilfe des Deltamoduls können Änderungen in der Datenbank schnell, einfach und effizient ermittelt werden.

Um Änderungen in einer Zeile identifizieren zu können, wird bei einem INSERT-, UPDATE- oder DELETE-Statement mittels Trigger ein MD5 über alle Inhalte einer Zeile berechnet und das Ergebnis in die Tabelle co_delta geschrieben.

Das Schreiben der Änderungen erfolgt mittels Trigger innerhalb der Datenbank und ist dadurch schnell und effizient.

Wird ein neuer oder geänderter Datensatz gespeichert, so ändert sich das Datum in der Spalte sys_lastupdate.

Das Datum ändert sich nicht, wenn der MD5 identisch ist. Das ist das Standardverhalten von MySQL.

ID

Jede Tabelle besitzt eine eindeutige ID mit der diese identifiziert wird. Diese ID wird in der Delta Route definiert. Für weitere Tabellen muss hier geprüft werden welche IDs schon vergeben sind.

<configuration>
  <urls>
    <url name="item" id="1">
      <![CDATA[/api/commerce/item/search?q=item.iid%20IN%20%22${idlist}%22]]>
    </url>
  </urls>   
</configuration>

Erstellen eines neuen Triggers

Hierzu steht der Befehl dev:createdeltasql zur Verfügung.

Ein neuer Trigger wird in /deployment/database/trigger_.sql abgelegt und muss eingereicht werden.

Export der Tabellen

Das Script /development/script/export-table.php muss mit --skip-triggers laufen, damit die Trigger nicht doppelt in den Dateien definiert werden.

co_delta_schedule_event

Es wird ein Event eingerichtet der jede Minute ausgeführt wird.

DROP EVENT IF EXISTS `delta_schedule_event`;
DELIMITER $$
CREATE EVENT delta_schedule_event 
ON SCHEDULE EVERY 1 MINUTE 
DO 
BEGIN
UPDATE co_delta as t2,
(   SELECT sys_id, sys_table 
    FROM co_delta_schedule_event 
    WHERE sys_date<=UNIX_TIMESTAMP(now())
) as t1
SET t2.sys_lastupdate = now()
WHERE t1.sys_id = t2.sys_id AND t1.sys_table = t2.sys_table;

DELETE FROM co_delta_schedule_event WHERE sys_date<=UNIX_TIMESTAMP(now());
END$$
DELIMITER ;

Bei Änderungen oder neuen Einträgen wird in die co_delta_schedule_event ein Eintrag eingestellt. Wenn das Datum Zutrifft, wird die Änderung in der co_delta entsprechend geändert so das wieder eine Änderung ausgelöst wird.

Es wird ein Eintrag beim Start und einer beim End angelegt.

Beispiel Trigger:

IF NEW.sys_start > now() && NEW.sys_end > NEW.sys_start
    THEN
    DELETE FROM co_delta_schedule_event WHERE sys_id=NEW.TID AND sys_table=34;
    INSERT INTO co_delta_schedule_event SET sys_id=NEW.TID , sys_table=34 , sys_date=UNIX_TIMESTAMP(NEW.sys_start);
    INSERT INTO co_delta_schedule_event SET sys_id=NEW.TID , sys_table=34 , sys_date=UNIX_TIMESTAMP(NEW.sys_end);       
END IF;

Prüfen

mit diesem Select kann geprüft werden ob der Event Planer gestartet wurde

select @@event_scheduler;

Wenn das Ergbnis "OFF" ist dann muss dieser gestartet werden.

mit diesem Befehl wird der Event Planer gestartet

SET GLOBAL event_scheduler = ON;

Mit diesem Befehl kann man prüfen welche Events laufen

SHOW EVENTS