2009-04-22 21 views
0

Ich habe ein eingebettetes Gerät, das eine Liste der inneren Tabellen hält. Ich möchte, dass es den Zustand dieser Tabelle mit einer externen Datenbank für Debugging-Zwecke synchronisiert. Das ist jedes Mal wenn ich ein Element zu einem bestimmten struct Array hinzufüge, möchte ich, dass das Gerät einen "INSERT INTO ..." Befehl ausgibt.serialisieren und deserialisieren SQL-Abfrage

Allerdings sende ich die Daten über ein serielles RS232-Kabel, was den Overhead des Sendens expliziten SQL inakzeptabel macht.

Da es nur 3 Arten von SQL-Befehlen gibt, die ich oft verwende, kann ich nur diese wenigen serialisieren. Nämlich INSERT INTO, DELETE FROM und UPDATE.

Die allgemeine Idee, die ich im Sinn hatte, ist, Daten mit einem "komprimierten/serialisierbaren" SQL-Protokoll zu senden. Wir werden keine Befehle direkt an SQL Server senden, sondern auf einen benutzerdefinierten serialisiert-SQL-Server werde ich schreiben:

  1. Wir werden eine Anzahl an jede Datenbank verändernde einfache Aktion zuweisen (dh INSERT, DELETE, UPDATE) . Die einzigen verfügbaren serializable-SQL-Befehle sind INSERT INTO x(), DELETE FROM x WHERE id=y. Wo können wir nur x und y ändern.
  2. Zunächst einmal alle notwendigen Tabellen auf dem Server erstellen. Halten Sie eine Hash-Tabelle auf dem Server, die jede Tabelle einer Nummer zuordnet. Dies kann in SQL erfolgen, da dies nur einmal durchgeführt wird.
  3. Dann vergeben Sie eine Nummer zu jeder Tabelle, stellen Sie sicher, dass der Server über diese Nummer
  4. Endlich, wann immer wir einen SQL-Befehl ausführen möchten, senden wir Befehlsnummer, gefolgt von Tabellennummer, gefolgt von Datenlänge gefolgt von Daten. Der Server würde das Layout der tatsächlichen Daten nach der Beschreibung der Tabelle herausfinden.

Zum Beispiel

INSERT INTO temperature(temperature,location) 
    VALUES ((108,"chille"),(120,"usa")) 

Würde zu

[INSERT INTO id][2 data to send] 
    [byte of 108][6 bytes string "chille"] 
    [byte of 120][3 bytes "usa"] 

und

DELETE FROM people (id,"bob") WHERE id=1 or id=2 

übersetzt wäre

übersetzt werden

Da id als eine ganze Zahl von einem Byte definiert ist.

Gibt es ein bekanntes Protokoll/Implementierung in diesem Sinne?

Hat jemand eine bessere Idee?

Antwort

0

Die meisten DBMS tun dies mit vorbereiteten Anweisungen. Sie erstellen eine Anweisung, z. B. eine Einfügung, und führen sie dann nur mit den relevanten Parametern aus. Der Server (oder Client) gibt der vorbereiteten Anweisung eine Art ID (normalerweise eine ganze Zahl, manchmal eine Zeichenfolge), und die clientseitige Bibliothek kann sie bei Bedarf erneut ausführen.

Einige Ihrer Ideen müssen verfeinert werden - das OR in DELETE ist insbesondere nicht offensichtlich. Außerdem müssten Sie definieren, ob Ihre zu versendenden N Daten eine Anzahl von Zeilen oder eine Anzahl von Werten identifizieren und wie viele Werte in der Zeile bei einer Anzahl von Zeilen angegeben werden.

+0

Danke für die Eingabe! 1) Immer Anzahl der Zeilen, ich sende immer alle Werte für die Kürze des Protokolls. 2) Ich möchte NUR auf der Grundlage eindeutiger ID aktualisieren/löschen, und wenn dies nur ODER sinnvoll ist. Ich nehme an, dass Sie keine ähnliche existierende Implementierung/Protokoll kennen. Danke –

0

Sie könnten hier eine vorzeitige Optimierung vornehmen, vor allem wenn man bedenkt, dass dies nur zum Testen ist. Ich würde das Feature mit SQL-Code implementieren und sehen, wie es funktioniert.

Dann überlegen Sie, wie viel Zeit Sie brauchen, um es zu verbessern und vergleichen Sie die Vorteile mit den anderen Dingen, die Sie in dieser Zeit tun könnten. Fügen Sie beispielsweise ein Feature hinzu, das ein Nutzer kaufen könnte.

+0

Ich bin auf einer RS232, Alter. Ich kann es mir wirklich nicht leisten, sogar 10 Mal mehr Daten zu senden, als ich derzeit habe. Ganz zu schweigen von dem Senden in ASCII. Mit einer vernünftigen Debugging-Umgebung und einem transparenten Fenster werden 75% der Debug-Zeit abgeschnitten. Die meiste Zeit der Fehlersuche wird beim Hinzufügen von Druckern verschwendet, um solche Informationen zu sehen. Robustes Logging-Framework wird viel mehr als eine kleine Funktion helfen. –

+0

Unterschätzen Sie nicht die Kosten für die Pflege eines benutzerdefinierten (Sie sagten robust?) Protokollierungsframeworks. Ich habe Leute gesehen, die viel Arbeit mit Logging- und ORM-Schichten zu tun haben, und sehr überrascht sein, wenn ihre Kunden unglücklich waren. Aber vielleicht werde ich alt und mürrisch;) – Andomar

Verwandte Themen