Записать 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());  
Другие вопросы по тегам