Delta

Mithilfe 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 Ende 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 Ergebnis "OFF" ist, dann muss dieser gestartet worden.

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

Abfragen

Delta Last Request

Datum formatiert selectieren :

SELECT UUID,sys_date,DATE_FORMAT(FROM_UNIXTIME(sys_date), '%d/%m/%Y %H:%i:%s') AS date 
FROM co_delta_lastrequest ORDER BY sys_date;

Delta Schedule

SELECT sys_table, sys_date,DATE_FORMAT(FROM_UNIXTIME(sys_date), '%d/%m/%Y %H:%i:%s') AS date 
FROM co_delta_schedule_event ORDER BY sys_date;

Delta

Gibt es Änderungen ? Das Datum kommt aus der co_delta_lastrequest Tabelle

SELECT FROM co_delta
      WHERE `co_delta`.`sys_table` IN  (1,5,6,2,3,32)) 
      AND (`co_delta`.`sys_lastupdate`>=from_unixtime(1669810634))

UNIX_TIMESTAMP(STR_TO_DATE('Oct 19 2018 10:00PM', '%M %d %Y %h:%i%p'))

Beispiel Änderungen laden von einer IID Es werden Änderungen von pb_item, pb_item_properties, pb_publishing, pb_item_text, sh_price co_object_relationship geladen , die IIDs werden gesammelt

SELECT `pb_item`.`IID` FROM `pb_item`
JOIN `co_delta` ON pb_item.IID=co_delta.sys_ID
WHERE (`co_delta`.`sys_lastupdate`>=from_unixtime(1669810634)) AND `co_delta`.`sys_table`=1
GROUP BY pb_item.IID
SELECT `pb_item_properties`.`sys_OID`
JOIN `co_delta` ON pb_item_properties.sys_PID=co_delta.sys_ID
WHERE (`co_delta`.`sys_lastupdate`>=from_unixtime(1669810634)) AND `co_delta`.`sys_table`=6
GROUP BY pb_item_properties.sys_OID

usw...