SQLite3: Вставьте BLOB с Нулевыми символами в C++

Вы можете увидеть этот пример кода о том, как проверить, существует ли папка назначения и вернуть ее идентификатор.

def get_folder_id(drive, parent_folder_id, folder_name):
    """ 
        Check if destination folder exists and return it's ID
    """

    # Auto-iterate through all files in the parent folder.
    file_list = GoogleDriveFileList()
    try:
        file_list = drive.ListFile(
            {'q': "'{0}' in parents and trashed=false".format(parent_folder_id)}
        ).GetList()
    # Exit if the parent folder doesn't exist
    except googleapiclient.errors.HttpError as err:
        # Parse error message
        message = ast.literal_eval(err.content)['error']['message']
        if message == 'File not found: ':
            print(message + folder_name)
            exit(1)
        # Exit with stacktrace in case of other error
        else:
            raise

    # Find the the destination folder in the parent folder's files
    for file1 in file_list:
        if file1['title'] == folder_name:
            print('title: %s, id: %s' % (file1['title'], file1['id']))
            return file1['id']

Также из этого учебника вы можете проверить, существует ли папка, а если нет, то создать ее с заданным именем.

8
задан jbatista 3 December 2010 в 17:09
поделиться

3 ответа

Вы захотите использовать эту функцию с подготовленным оператором.

int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));

В C/C++ стандартный способ иметь дело с ПУСТЫМИ УКАЗАТЕЛЯМИ в строках состоит в том, чтобы или сохранить начало строки и длины, или сохранить указатель на начало строки и один в конец строки.

8
ответ дан 5 December 2019 в 09:26
поделиться

Вы хотите предварительно скомпилировать оператор sqlite_prepare_v2(), и затем свяжите блоб в использовании sqlite3_bind_blob(). Обратите внимание, что оператором, в котором Вы связываете, будут ЗНАЧЕНИЯ таблицы INSERT INTO (?).

1
ответ дан 5 December 2019 в 09:26
поделиться

Поблагодарите всех снова за свою обратную связь. На этот раз я сообщаю, как я решил проблему с помощью признаков, обеспеченных здесь. Надо надеяться, это поможет другим в будущем.

Как предложено первыми тремя плакатами, я действительно использовал подготовленные операторы — дополнительно, потому что я также интересовался получением типов данных столбцов и простого sqlite3_get_table() не сделал бы.

После подготовки SQL-оператора в форме следующей постоянной строки:

INSERT INTO table VALUES(?,?,?,?);

это остается привязкой соответствующих значений. Это сделано путем издания как многие sqlite3_bind_blob() вызовы как столбцы. (Я также обратился к sqlite3_bind_text() для других "простых" типов данных, потому что API я продолжаю работать, может перевести целые числа/удваивать/и т.д. в строку). Так:

void* blobvalue[4];
int blobsize[4];
char *tail, *sql="INSERT INTO table VALUES(?,?,?,?)";
sqlite3_stmt *stmt=0;
sqlite3 *db;
/* ... */
db=sqlite3_open("sqlite.db");
sqlite3_prepare_v2(db, 
                   sql, strlen(sql)+1, 
                   &stmt, &tail);
for(int i=0; i<4; i++)
    sqlite3_ bind_ blob(stmt, 
                        i+1, blobvalue[i], blobsize[i], 
                        SQLITE_TRANSIENT);
if(sqlite3_step(stmt)!=SQLITE_DONE) 
    printf("Error message: %s\n", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
sqlite3_close(db);

Обратите внимание также что некоторые функции (sqlite3_open_v2(), sqlite3_prepare_v2()) появитесь на позже версии SQLite (я предполагаю 3.5.x и позже).

9
ответ дан 5 December 2019 в 09:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: