SQLite Blob insertion c++

c++, sqlite

Solution

Your code has too many errors to count.

Try something like this:

int InsertFile(const string& db_name)
{
    ifstream file("Sql.pdf", ios::in | ios::binary);
    if (!file) {
        cerr << "An error occurred opening the file\n";
        return 12345;
    }
    file.seekg(0, ifstream::end);
    streampos size = file.tellg();
    file.seekg(0);

    char* buffer = new char[size];
    file.read(buffer, size);

    sqlite3 *db = NULL;
    int rc = sqlite3_open_v2(db_name.c_str(), &db, SQLITE_OPEN_READWRITE, NULL);
    if (rc != SQLITE_OK) {
        cerr << "db open failed: " << sqlite3_errmsg(db) << endl;
    } else {
        sqlite3_stmt *stmt = NULL;
        rc = sqlite3_prepare_v2(db,
                                "INSERT INTO ONE(ID, NAME, LABEL, GRP, FILE)"
                                " VALUES(NULL, 'fedfsdfss', NULL, NULL, ?)",
                                -1, &stmt, NULL);
        if (rc != SQLITE_OK) {
            cerr << "prepare failed: " << sqlite3_errmsg(db) << endl;
        } else {
            // SQLITE_STATIC because the statement is finalized
            // before the buffer is freed:
            rc = sqlite3_bind_blob(stmt, 1, buffer, size, SQLITE_STATIC);
            if (rc != SQLITE_OK) {
                cerr << "bind failed: " << sqlite3_errmsg(db) << endl;
            } else {
                rc = sqlite3_step(stmt);
                if (rc != SQLITE_DONE)
                    cerr << "execution failed: " << sqlite3_errmsg(db) << endl;
            }
        }
        sqlite3_finalize(stmt);
    }
    sqlite3_close(db);

    delete[] buffer;
}

Problem

After visiting dozens of websites containing info about SQLite I still cannot find a solution to fix an error while binding a blob. Here is the table decleration: ``` CREATE TABLE ONE ( ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, NAME CHAR( 50 ) NOT NULL, LABEL CHAR( 50 ), GRP CHAR( 50 ), FILE BLOB ); ``` And here is the code for insertion: ``` int InsertFile(string name) { const char* dbname = name.c_str(); sqlite3 *database; int rc = sqlite3_open(dbname, &database); char *zErrMsg = 0; unsigned char *buffer = (unsigned char*) malloc(sizeof(char)*MAX); ifstream file; file.open("Sql.pdf", ios::in|ios::binary); if ( ! file ) { cout << "An error occurred opening the file" << endl; } int count = 0; const void* fileptr = NULL; fileptr = buffer; while(file.good()) { char c=file.get(); buffer[count]=c; count++; } file.close(); sqlite3_stmt *stmt = NULL; char* statement = "INSERT INTO ONE( ID, NAME, LABEL, GRP, FILE ) VALUES ( NULL, 'fedfsdfss', NULL, NULL, ?);"; rc = sqlite3_prepare_v2(database, statement, 0, &stmt, NULL); rc = sqlite3_bind_blob(stmt, 1, fileptr, sizeof(char)*count, SQLITE_TRANSIENT); const char* result = sqlite3_errmsg(database); rc = sqlite3_step(stmt); result = sqlite3_errmsg(database); sqlite3_close(database); free(buffer); fileptr=NULL; return 0; ``` } EDIT: Pasted full function, the amount of characters im trying to insert is about 350K. The result from binb_blob is always 21, error code contains nothing. buffer contains binary file data, which most probably isn't too big hence the error code. Any hints would be apprieciated.

Original source