2009-04-22 4 views
0

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

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

Поскольку существует только 3 типа команд 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] 

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

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

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

ответ

0

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

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

+0

Спасибо за ввод! 1) Всегда количество строк, я всегда отправляю все значения для терпения протокола. 2) Я хочу обновлять/удалять ТОЛЬКО на основе уникального идентификатора, и если так, то только ИЛИ имеет смысл. Я предполагаю, что вы не знаете какой-либо аналогичной существующей реализации/протокола. Спасибо –

0

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

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

+0

Я нахожусь на RS232, чувак. Я действительно не могу позволить даже отправить в 10 раз больше данных, чем в настоящее время. Не говоря уже о отправке в ASCII. Наличие приличной среды отладки и прозрачного окна будет отключено, как 75% времени отладки. Большая часть времени отладки тратится на добавление printf для просмотра такой информации. Надежная система ведения журналов поможет гораздо больше, чем небольшая функция. –

+0

Не стоит недооценивать стоимость сохранения пользовательской (вы сказали, надежной?) Структуры ведения журнала. Я видел, как люди тратят много работы на каротаж и уровни ORM, и очень удивляются, когда их клиенты были недовольны. Но, может быть, я становлюсь старым и сварливым;) – Andomar

Смежные вопросы