Effiziente externe Dienstplanung mit MySQL und ejabberd

9

Frage

Bitte beachten Sie, dass die Lösung hierfür direkt unter der Eugen-Ansichtsidee liegt!

Ich schreibe ein Chat-Modul für eine benutzergesteuerte PHP / MySQL-Site, die es zwei Benutzern ermöglicht, Freunde zu finden, und sich für das Chat-System für eJabberd entschieden hat.

Ich habe die externe Authentifizierung erfolgreich mit einem PHP-Daemon eingerichtet, und jetzt habe ich erfolgreich die Freundschaften durch Verwendung von mod_roster_odbc in eJabberd gebracht und die MySQL rosterusers -Tabelle manuell gefüllt. Nach vielen Ausgrabungen gelang es mir, diesen speziellen Kommentar zu finden, der sehr hilfreich war, um zu wissen, worauf man jede Spalte setzen sollte , um diese Freundschaft in einer Freundesliste für das Chatmodul darzustellen.

Meine aktuelle Methode zum Bearbeiten von Freundschaften besteht darin, zwei Zeilen in die Tabelle rosterusers einzufügen:

%Vor%

Ich bin nicht sehr glücklich damit, weil zwei Reihen für eine gegenseitige Freundschaft erforderlich sind.

Ich verstehe, dass XMPP standardmäßig einzelne und doppelte Verbindungen zwischen Benutzern ermöglicht. Wie man aus der Natur meiner Frage ableiten kann, verwendet das Freundsystem meiner eigenen Anwendung eine Zeile, um eine Freundschaft darzustellen.

Meine Hauptfragen:

  1. Ist es möglich, diese Freundschaft in nur einer Zeile zu konsolidieren? Ich habe einige Kombinationen aus dieser inoffiziellen Dokumentation ausprobiert, hatte aber keinen Erfolg. Ich teste, indem ich mich mit dem Pidgin-Client mit meinem XMPP-Server verbinde.
  2. Was ist der beste Weg, um die beiden Datenbanken - Freunde und XMPP-Roster - synchron zu halten? Ich denke, dass ein MySQL TRIGGER für jetzt die sauberste Option sein könnte.

Wenn nicht, dann ist meine andere Option, die Tabelle rosterusers zu ändern und dafür zu sorgen, dass sie sich auf die Friend-Zeile meiner eigenen Anwendung bezieht, so dass sie wie ein Cross-Datenbank-Fremdschlüssel funktioniert.

Lösungscode

Ich habe eine Ansicht erstellt, wie Eugen vorgeschlagen hat. Der Code ist nicht der eleganteste, aber ich habe ihn getestet und er funktioniert mit eJabberd 2.1 auf MySQL 5.5.

Meine genaue Konfiguration verwendet zwei Datenbanken. Daher verweise ich explizit auf die Datenbank meiner Hauptanwendung, indem ich main_database.table_name verwende.

Der Code ist eine Vereinigung von zwei Abfragen - die erste nimmt Benutzer, Freund und dann die zweite fügt Freund, Benutzer ein. Ich verwende UNION ALL für die Geschwindigkeit und lasse "Duplikate" durch.

Ich denke, das ist eine wirklich gute Möglichkeit, das Problem zu lösen, da keine Änderungen in der Anwendung erforderlich sind, und es wird sofort aktualisiert.

%Vor%     
Will Morgan 06.07.2012, 10:49
quelle

1 Antwort

3

IIUC, die Tabelle rosterusers ist schreibgeschützt vom POV Ihrer eJabberd Server-App. Dies würde es einfach machen, es durch ein view zu ersetzen, das die benötigte 2 Zeile aus 1 Zeile in Ihrer eigenen Freundes-Tabelle erstellt.

Wenn ich die Struktur Ihrer eigenen Freundschaftstabelle nicht kenne, kann ich Ihnen nicht den vollen Code geben, aber hier ist das, was ich als Pseudo-SQL empfand

%Vor%

und dann

%Vor%

sollte Ihnen zwei Zeilen geben, eine aus jedem Teil von UNION in der Ansicht

    
Eugen Rieck 06.07.2012, 11:05
quelle

Tags und Links