crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> помещение бинарных данных в строку
legat
  опции профиля:
сообщение 19.5.2011, 10:21
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 8.8.2010
Пользователь №: 1940

Спасибо сказали: 0 раз(а)




Репутация:   0  


Имеются запросы к SQLite БД по созданию таблицы и добавления в неё бинарных данных:
const std::string CREATE_FILE = "Create table files( id integer primary key autoincrement, file blob );";
const std::string ADD_FILE = "Insert into files( file ) values( '%s' ); Select last_insert_rowid( );";


Сам запрос я формирую в строке str следующим образом:
std::string str;
sprintf( ( char * )str.c_str( ), ADD_FILE.c_str( ), blobData );
executeSQL( str );


Вопрос:
Как мне передать в строку бинарные данные, которые могут содержать \0 и прочие служебные символы в середине, чтобы не было потери данных.
blobData предположительно char *. Не могу пока найти, что использовать для бинарных данным в строке формата вместо %s.

Можно, конечно, передавать в строку в цикле побайтово из blobData. Но это слишком не эффективно. К тому же не ясно, что делать с \0-ми.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.5.2011, 13:59
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


legat, у меня вопрос:
Отвлечёмся от программирования на Си\Си++. Оставим один SQL. Как ты в запрос:
Insert into files( file ) values( '%s' )
собираешься помещать двоичные данные?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
legat
  опции профиля:
сообщение 20.5.2011, 9:25
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 8.8.2010
Пользователь №: 1940

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 19.5.2011, 14:59) *
legat, у меня вопрос:
Отвлечёмся от программирования на Си\Си++. Оставим один SQL. Как ты в запрос:
Insert into files( file ) values( '%s' )
собираешься помещать двоичные данные?

Двоичные данные - это массив байтов. В терминах С++ можно представить как массив char. Следовательно передаётся в sql запрос как строка. Проблема только в том, что символом \0 строка зарубается на середине и соответственно теряются данные. Я поэтому и хочу понять, как можно передать корректно двоичные данные в запрос. Понятно, что %s временное условно работающее решение.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.5.2011, 17:04
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(legat @ 20.5.2011, 12:25) *
В терминах С++
Цитата(Litkevich Yuriy @ 19.5.2011, 16:59) *
Отвлечёмся от программирования на Си\Си++. Оставим один SQL.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
jrjr
  опции профиля:
сообщение 5.6.2011, 18:05
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 1
Регистрация: 5.6.2011
Пользователь №: 2719

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(legat @ 19.5.2011, 11:21) *
Имеются запросы к SQLite БД по созданию таблицы и добавления в неё бинарных данных:
const std::string CREATE_FILE = "Create table files( id integer primary key autoincrement, file blob );";
const std::string ADD_FILE = "Insert into files( file ) values( '%s' ); Select last_insert_rowid( );";


Сам запрос я формирую в строке str следующим образом:
std::string str;
sprintf( ( char * )str.c_str( ), ADD_FILE.c_str( ), blobData );
executeSQL( str );


Вопрос:
Как мне передать в строку бинарные данные, которые могут содержать \0 и прочие служебные символы в середине, чтобы не было потери данных.
blobData предположительно char *. Не могу пока найти, что использовать для бинарных данным в строке формата вместо %s.

Можно, конечно, передавать в строку в цикле побайтово из blobData. Но это слишком не эффективно. К тому же не ясно, что делать с \0-ми.

Например экранировать их? Эта проблема настолько стара насколько существует SQL. По запросу "экранирование служебных символов" ты найдешь все что нужно.


Цитата(jrjr @ 5.6.2011, 19:03) *
Цитата(legat @ 19.5.2011, 11:21) *
Имеются запросы к SQLite БД по созданию таблицы и добавления в неё бинарных данных:
const std::string CREATE_FILE = "Create table files( id integer primary key autoincrement, file blob );";
const std::string ADD_FILE = "Insert into files( file ) values( '%s' ); Select last_insert_rowid( );";


Сам запрос я формирую в строке str следующим образом:
std::string str;
sprintf( ( char * )str.c_str( ), ADD_FILE.c_str( ), blobData );
executeSQL( str );


Вопрос:
Как мне передать в строку бинарные данные, которые могут содержать \0 и прочие служебные символы в середине, чтобы не было потери данных.
blobData предположительно char *. Не могу пока найти, что использовать для бинарных данным в строке формата вместо %s.

Можно, конечно, передавать в строку в цикле побайтово из blobData. Но это слишком не эффективно. К тому же не ясно, что делать с \0-ми.

Например экранировать их? Эта проблема настолько стара насколько существует SQL. По запросу "экранирование служебных символов" ты найдешь все что нужно.

Например на вскидку можно перед символом \0 вставить \ и все будет ок.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 6.6.2011, 7:22
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1595
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


это ересь какая-то. я не знаю, какая библиотека используется автором вопроса, но вообще, сами SQLite имеют превосходную библиотеку и к ней есть документация, с примерами. и там есть функции работы с блобами sqlite3_blob_ХХХ.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 6.6.2011, 16:19
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Как вариант (ну не пинайте за его глупость) можно перед вставкой перекодировать двоичные данный в BASE64.
BASE64 собственно и придумали чтобы двоичные данные передавать по текстовым протоколам а-ля HTTP.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.9.2020, 22:04