2013-10-03 2 views
1

У меня есть таблица mysql с полем longblob. Я успешно вставил записи blob в таблицу и извлек их обратно в файлы на диске с помощью python.пишите longblob в файл из C++ mysql connector select

Теперь я хочу выбрать последнюю версию blob из таблицы и записать ее в файл на диске с использованием C++ и mysql-коннектора. Это код, который у меня есть до сих пор.

Он работает для небольших капель, но недостаточно для больших капель в моей базе данных. Максимальный размер буфера около 1000000.

Как написать большие файлы longblob из mysql select?

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 
+0

мой Баунти просто ищет фрагмент кода, чтобы заменить в приведенный выше код, который заставит его работать с гораздо большими блобами. Нет необходимости предоставлять всю программу. что у меня выше работает, просто не для очень больших капель – panofish

ответ

2

Это большой буфер. Вероятно, вы исчерпали пространство стека. Выделите кучу, добавив некоторое управление памятью или используя вектор. Вы сказали, что можете использовать около 1000000. Изменчивость существует из-за пространства стека, которое используется остальной частью кода.

#include <vector>; 
std::vector<char> buffer(1000000, '\0'); 
blob->read(&buffer[0], buffer.size()); 

Для получения дополнительной информации о стеке против кучи памяти, смотрите here и here

+0

Спасибо ... Я проверю это, когда у меня будет такая возможность. Надеюсь, на следующей неделе. – panofish

0

Где буфер определяется пут:

std::vector<char> buffer(1000000, '\0'); 
blob->read(&buffer[0], buffer.size());