MySQL- Руководство разработчика

Загрузка двоичного файла в столбец типа BLOB


Эта функция появилась в MySQL version 3.23, но многие пользователи все еще используют старые версии. Пример показывает несколько свойств MySQL++. Эта программа требует одного параметра, который является полным путевым именем для двоичного файла. #include <sys/stat.h> #include <fstream> #include <mysql++>

extern int errno; const char MY_DATABASE[]="telcent"; const char MY_TABLE[]="fax"; const char MY_HOST[]="localhost"; const char MY_USER[]="root"; const char MY_PASSWORD[]=""; const char MY_FIELD[]="fax"; // BLOB field

int main(int argc, char *argv[]) { if (argc < 2) { cerr << "Usage: load_file full_file_path" << endl<< endl; return -1; } Connection con(use_exceptions); try { con.real_connect(MY_DATABASE,MY_HOST,MY_USER,MY_PASSWORD,3306, (int)0,60,NULL); Query query = con.query(); ostrstream strbuf; ifstream In (argv[1],ios::in| ios::binary); struct stat for_len; if ((In.rdbuf())->is_open()) { if (stat (argv[1],& for_len) == -1) return -1; unsigned int blen = for_len.st_size; if (!blen) return -1; char *read_buffer= new char[blen]; In.read(read_buffer,blen); string fill(read_buffer,blen); strbuf << "INSERT INTO " << MY_TABLE <<" (" << MY_FIELD << ") VALUES(\"" << escape << fill << "\")"; query.exec(strbuf.str()); delete[] read_buffer; } else cerr << "Your binary file " << argv[1] << "could not be open, errno = " << errno; return 0; } catch (BadQuery er) { cerr << "Error: " <<er.error << " " <<con.errnum() << endl; return -1; } }

Одно из свойств, которое отображается в этом примере, манипулятор escape. Хотя автоматическое цитирование и экранирование появилось в версии 1.6, это применимо только к классам ColData, так как они содержат информацию о типе данных. Авторы пакета могли бы также делать цитирование и экранировку на общей строке типа данных, но требуется просмотреть всю строку, чтобы выявить все места, где нужна экранировка служебных символов. Поскольку это свойство замедлит код, оно не реализовано.



Содержание раздела