сериализация и десериализация SQL-запроса - PullRequest
1 голос
/ 22 апреля 2009

У меня есть встроенное устройство, которое хранит список внутренних таблиц. Я хотел бы синхронизировать состояние этой таблицы с некоторой внешней базой данных для целей отладки. То есть всякий раз, когда я добавляю элемент к определенному массиву struct, я хочу, чтобы устройство выдало команду «INSERT INTO ...».

Однако я отправляю данные по последовательному кабелю RS232, что делает неприемлемыми дополнительные затраты на отправку явного SQL.

Поскольку я часто использую только три типа команд SQL, я могу сериализовать только эти несколько. А именно INSERT INTO, DELETE FROM и UPDATE.

Основная идея, которую я имел в виду, - отправлять данные с помощью «сжатого / сериализуемого» протокола SQL. Мы не будем отправлять команды непосредственно на сервер SQL, а на пользовательский сервер сериализованного SQL, я напишу:

  1. Мы назначим номер каждому изменяющему базу данных простому действию (например, INSERT, DELETE, UPDATE). Единственные доступные команды serializable-SQL - INSERT INTO x (), DELETE FROM x WHERE id=y. Где мы можем изменить только x и y.
  2. Сначала создайте все необходимые таблицы на сервере один раз. Храните хеш-таблицу на сервере, который сопоставляет каждую таблицу с числом. Это может быть сделано в простом SQL, поскольку это делается только один раз.
  3. Затем назначьте номер каждой таблице, убедитесь, что сервер знает об этом номере
  4. Наконец, всякий раз, когда мы хотим выполнить команду SQL, мы отправляем номер команды, затем номер таблицы, затем длину данных и данные. Сервер определит расположение фактических данных по описанию таблицы.

Например

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

Будет переведено на

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

и

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

Будет переведено на

[DELETE id][2 data to send][byte of 1][byte 2]

Поскольку идентификатор определяется как одно байтовое целое число.

Существует ли какой-либо известный протокол / реализация в этом духе? ​​

У кого-нибудь есть идея получше?

Ответы [ 2 ]

0 голосов
/ 22 апреля 2009

Возможно, вы делаете преждевременную оптимизацию, особенно учитывая, что это только для тестирования. Я бы реализовал эту функцию, используя простой SQL, и посмотрю, как она работает.

Затем подумайте, сколько времени вам понадобится для его улучшения, и сравните преимущества с другими вещами, которые вы могли бы сделать за это время. Как добавить функцию, которую может купить пользователь.

0 голосов
/ 22 апреля 2009

Большинство СУБД делают это с подготовленными утверждениями. Вы готовите оператор, например, вставку, а затем выполняете его только с соответствующими параметрами. Сервер (или клиент) дает подготовленному оператору некоторый идентификатор (обычно целое число, иногда строку), и библиотека на стороне клиента может повторно выполнить его по требованию.

Некоторые из ваших идей нуждаются в уточнении - в частности, ИЛИ в УДАЛЕНИИ неочевидно. Кроме того, вам необходимо определить, будут ли ваши «N данных для отправки» идентифицировать количество строк или количество значений, и, если количество строк, как определить, сколько значений в строке.

...