Вы можете увидеть этот пример кода о том, как проверить, существует ли папка назначения и вернуть ее идентификатор.
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']
Также из этого учебника вы можете проверить, существует ли папка, а если нет, то создать ее с заданным именем.
Вы захотите использовать эту функцию с подготовленным оператором.
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
В C/C++ стандартный способ иметь дело с ПУСТЫМИ УКАЗАТЕЛЯМИ в строках состоит в том, чтобы или сохранить начало строки и длины, или сохранить указатель на начало строки и один в конец строки.
Вы хотите предварительно скомпилировать оператор sqlite_prepare_v2()
, и затем свяжите блоб в использовании sqlite3_bind_blob()
. Обратите внимание, что оператором, в котором Вы связываете, будут ЗНАЧЕНИЯ таблицы INSERT INTO (?).
Поблагодарите всех снова за свою обратную связь. На этот раз я сообщаю, как я решил проблему с помощью признаков, обеспеченных здесь. Надо надеяться, это поможет другим в будущем.
Как предложено первыми тремя плакатами, я действительно использовал подготовленные операторы — дополнительно, потому что я также интересовался получением типов данных столбцов и простого 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 и позже).