Записать longblob в файл из C++ MySQL
У меня есть таблица MySQL с полем longblob. Я успешно вставил записи больших двоичных объектов в таблицу и извлек их обратно в файлы на диске, используя python.
Теперь я хочу выбрать из таблицы блоб последней версии и записать его в файл на диске с помощью коннектора C++ и mysql. Это код, который я до сих пор.
Похоже, что он работает для небольших объектов, но недостаточно для больших объектов в моей базе данных. Максимальный размер буфера, кажется, около 1000000.
Как я могу написать большие файлы longblob из выбора MySQL?
string appname = "rocket.exe";
driver = get_driver_instance();
con = driver->connect(mysql_server, mysql_user, mysql_password);
con->setSchema("app");
stmt = con->createStatement();
sqlstring =
"select installer"
" from app_table"
" where appname = '" + appname + "'"
" order by version desc "
" limit 1";
std::istream *blob;
res = stmt->executeQuery(sqlstring);
while (res->next()) {
blob = res->getBlob("installer");
}
char buffer[1000000];
memset(buffer, '\0', 1000000);
blob->read((char*)buffer,1000000);
std::ofstream outfile ("rocket2.exe",std::ofstream::binary);
outfile.write (buffer,1000000);
outfile.close();
delete res; // resultset
delete stmt; // statement
delete con; // connection
2 ответа
Это большой буфер. Возможно, вам не хватает места в стеке. Выделите кучи, добавив немного управления памятью или используя вектор. Вы сказали, что можете использовать около 1000000. Изменчивость обусловлена тем, что пространство стека используется остальной частью кода.
#include <vector>;
std::vector<char> buffer(1000000, '\0');
blob->read(&buffer[0], buffer.size());
Для получения дополнительной информации о стеке кучи памяти смотрите здесь и здесь
Где определен буфер:
std::vector<char> buffer(1000000, '\0');
blob->read(&buffer[0], buffer.size());