📄 db.c
字号:
sqlite3_stmt *yum_db_package_prepare (sqlite3 *db, GError **err){ int rc; sqlite3_stmt *handle = NULL; const char *query; query = "INSERT INTO packages (" " pkgId, name, arch, version, epoch, release, summary, description," " url, time_file, time_build, rpm_license, rpm_vendor, rpm_group," " rpm_buildhost, rpm_sourcerpm, rpm_header_start, rpm_header_end," " rpm_packager, size_package, size_installed, size_archive," " location_href, location_base, checksum_type) " "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?," " ?, ?, ?, ?, ?, ?, ?)"; rc = sqlite3_prepare (db, query, -1, &handle, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not prepare packages insertion: %s", sqlite3_errmsg (db)); sqlite3_finalize (handle); handle = NULL; } return handle;}voidyum_db_package_write (sqlite3 *db, sqlite3_stmt *handle, Package *p){ int rc; sqlite3_bind_text (handle, 1, p->pkgId, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 2, p->name, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 3, p->arch, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 4, p->version, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 5, p->epoch, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 6, p->release, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 7, p->summary, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 8, p->description, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 9, p->url, -1, SQLITE_STATIC); sqlite3_bind_int (handle, 10, p->time_file); sqlite3_bind_int (handle, 11, p->time_build); sqlite3_bind_text (handle, 12, p->rpm_license, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 13, p->rpm_vendor, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 14, p->rpm_group, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 15, p->rpm_buildhost, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 16, p->rpm_sourcerpm, -1, SQLITE_STATIC); sqlite3_bind_int (handle, 17, p->rpm_header_start); sqlite3_bind_int (handle, 18, p->rpm_header_end); sqlite3_bind_text (handle, 19, p->rpm_packager, -1, SQLITE_STATIC); sqlite3_bind_int (handle, 20, p->size_package); sqlite3_bind_int (handle, 21, p->size_installed); sqlite3_bind_int (handle, 22, p->size_archive); sqlite3_bind_text (handle, 23, p->location_href, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 24, p->location_base, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 25, p->checksum_type, -1, SQLITE_STATIC); rc = sqlite3_step (handle); sqlite3_reset (handle); if (rc != SQLITE_DONE) { g_critical ("Error adding package to SQL: %s", sqlite3_errmsg (db)); } else p->pkgKey = sqlite3_last_insert_rowid (db);}sqlite3_stmt *yum_db_dependency_prepare (sqlite3 *db, const char *table, GError **err){ int rc; sqlite3_stmt *handle = NULL; char *query; const char *pre_name = ""; const char *pre_value = ""; if (!strcmp (table, "requires")) { pre_name = ", pre"; pre_value = ", ?"; } query = g_strdup_printf ("INSERT INTO %s (name, flags, epoch, version, release, pkgKey%s) " "VALUES (?, ?, ?, ?, ?, ?%s)", table, pre_name, pre_value); rc = sqlite3_prepare (db, query, -1, &handle, NULL); g_free (query); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not prepare dependency insertion: %s", sqlite3_errmsg (db)); sqlite3_finalize (handle); handle = NULL; } return handle;}voidyum_db_dependency_write (sqlite3 *db, sqlite3_stmt *handle, gint64 pkgKey, Dependency *dep, gboolean isRequirement){ int rc; sqlite3_bind_text (handle, 1, dep->name, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 2, dep->flags, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 3, dep->epoch, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 4, dep->version, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 5, dep->release, -1, SQLITE_STATIC); sqlite3_bind_int (handle, 6, pkgKey); if (isRequirement) { if (dep->pre) sqlite3_bind_text (handle, 7, "TRUE", -1, SQLITE_TRANSIENT); else sqlite3_bind_text (handle, 7, "FALSE", -1, SQLITE_TRANSIENT); } rc = sqlite3_step (handle); sqlite3_reset (handle); if (rc != SQLITE_DONE) g_critical ("Error adding dependency to SQL: %s", sqlite3_errmsg (db));}sqlite3_stmt *yum_db_file_prepare (sqlite3 *db, GError **err){ int rc; sqlite3_stmt *handle = NULL; const char *query; query = "INSERT INTO files (name, type, pkgKey) VALUES (?, ?, ?)"; rc = sqlite3_prepare (db, query, -1, &handle, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not prepare file insertion: %s", sqlite3_errmsg (db)); sqlite3_finalize (handle); handle = NULL; } return handle;}voidyum_db_file_write (sqlite3 *db, sqlite3_stmt *handle, gint64 pkgKey, PackageFile *file){ int rc; sqlite3_bind_text (handle, 1, file->name, -1, SQLITE_STATIC); sqlite3_bind_text (handle, 2, file->type, -1, SQLITE_STATIC); sqlite3_bind_int (handle, 3, pkgKey); rc = sqlite3_step (handle); sqlite3_reset (handle); if (rc != SQLITE_DONE) g_critical ("Error adding package file to SQL: %s", sqlite3_errmsg (db));}voidyum_db_create_filelist_tables (sqlite3 *db, GError **err){ int rc; const char *sql; sql = "CREATE TABLE packages (" " pkgKey INTEGER PRIMARY KEY," " pkgId TEXT)"; rc = sqlite3_exec (db, sql, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not create packages table: %s", sqlite3_errmsg (db)); return; } sql = "CREATE TABLE filelist (" " pkgKey INTEGER," " dirname TEXT," " filenames TEXT," " filetypes TEXT)"; rc = sqlite3_exec (db, sql, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not create filelist table: %s", sqlite3_errmsg (db)); return; } sql = "CREATE INDEX keyfile ON filelist (pkgKey)"; rc = sqlite3_exec (db, sql, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not create keyfile index: %s", sqlite3_errmsg (db)); return; } sql = "CREATE INDEX pkgId ON packages (pkgId)"; rc = sqlite3_exec (db, sql, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not create pkgId index: %s", sqlite3_errmsg (db)); return; } sql = "CREATE INDEX dirnames ON filelist (dirname)"; rc = sqlite3_exec (db, sql, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not create dirnames index: %s", sqlite3_errmsg (db)); return; } sql = "CREATE TRIGGER remove_filelist AFTER DELETE ON packages" " BEGIN" " DELETE FROM filelist WHERE pkgKey = old.pkgKey;" " END;"; rc = sqlite3_exec (db, sql, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not create remove_filelist trigger: %s", sqlite3_errmsg (db)); return; }}sqlite3_stmt *yum_db_package_ids_prepare (sqlite3 *db, GError **err){ int rc; sqlite3_stmt *handle = NULL; const char *query; query = "INSERT INTO packages (pkgId) VALUES (?)"; rc = sqlite3_prepare (db, query, -1, &handle, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not prepare package ids insertion: %s", sqlite3_errmsg (db)); sqlite3_finalize (handle); handle = NULL; } return handle;}voidyum_db_package_ids_write (sqlite3 *db, sqlite3_stmt *handle, Package *p){ int rc; sqlite3_bind_text (handle, 1, p->pkgId, -1, SQLITE_STATIC); rc = sqlite3_step (handle); sqlite3_reset (handle); if (rc != SQLITE_DONE) { g_critical ("Error adding package to SQL: %s", sqlite3_errmsg (db)); } else p->pkgKey = sqlite3_last_insert_rowid (db);}sqlite3_stmt *yum_db_filelists_prepare (sqlite3 *db, GError **err){ int rc; sqlite3_stmt *handle = NULL; const char *query; query = "INSERT INTO filelist (pkgKey, dirname, filenames, filetypes) " " VALUES (?, ?, ?, ?)"; rc = sqlite3_prepare (db, query, -1, &handle, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not prepare filelist insertion: %s", sqlite3_errmsg (db)); sqlite3_finalize (handle); handle = NULL; } return handle;}typedef struct { sqlite3 *db; sqlite3_stmt *handle; gint64 pkgKey;} FileWriteInfo;static voidwrite_file (gpointer key, gpointer value, gpointer user_data){ EncodedPackageFile *file = (EncodedPackageFile *) value; FileWriteInfo *info = (FileWriteInfo *) user_data; int rc; sqlite3_bind_int (info->handle, 1, info->pkgKey); sqlite3_bind_text (info->handle, 2, (const char *) key, -1, SQLITE_STATIC); sqlite3_bind_text (info->handle, 3, file->files->str, -1, SQLITE_STATIC); sqlite3_bind_text (info->handle, 4, file->types->str, -1, SQLITE_STATIC); rc = sqlite3_step (info->handle); sqlite3_reset (info->handle); if (rc != SQLITE_DONE) { g_critical ("Error adding file to SQL: %s", sqlite3_errmsg (info->db)); }}voidyum_db_filelists_write (sqlite3 *db, sqlite3_stmt *handle, Package *p){ GHashTable *hash; FileWriteInfo info; info.db = db; info.handle = handle; info.pkgKey = p->pkgKey; hash = package_files_to_hash (p->files); g_hash_table_foreach (hash, write_file, &info); g_hash_table_destroy (hash);}voidyum_db_create_other_tables (sqlite3 *db, GError **err){ int rc; const char *sql; sql = "CREATE TABLE packages (" " pkgKey INTEGER PRIMARY KEY," " pkgId TEXT)"; rc = sqlite3_exec (db, sql, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not create packages table: %s", sqlite3_errmsg (db)); return; } sql = "CREATE TABLE changelog (" " pkgKey INTEGER," " author TEXT," " date INTEGER," " changelog TEXT)"; rc = sqlite3_exec (db, sql, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not create changelog table: %s", sqlite3_errmsg (db)); return; } sql = "CREATE INDEX keychange ON changelog (pkgKey)"; rc = sqlite3_exec (db, sql, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not create keychange index: %s", sqlite3_errmsg (db)); return; } sql = "CREATE INDEX pkgId ON packages (pkgId)"; rc = sqlite3_exec (db, sql, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not create pkgId index: %s", sqlite3_errmsg (db)); return; } sql = "CREATE TRIGGER remove_changelogs AFTER DELETE ON packages" " BEGIN" " DELETE FROM changelog WHERE pkgKey = old.pkgKey;" " END;"; rc = sqlite3_exec (db, sql, NULL, NULL, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not create remove_changelogs trigger: %s", sqlite3_errmsg (db)); return; }}sqlite3_stmt *yum_db_changelog_prepare (sqlite3 *db, GError **err){ int rc; sqlite3_stmt *handle = NULL; const char *query; query = "INSERT INTO changelog (pkgKey, author, date, changelog) " " VALUES (?, ?, ?, ?)"; rc = sqlite3_prepare (db, query, -1, &handle, NULL); if (rc != SQLITE_OK) { g_set_error (err, YUM_DB_ERROR, YUM_DB_ERROR, "Can not prepare changelog insertion: %s", sqlite3_errmsg (db)); sqlite3_finalize (handle); handle = NULL; } return handle;}voidyum_db_changelog_write (sqlite3 *db, sqlite3_stmt *handle, Package *p){ GSList *iter; ChangelogEntry *entry; int rc; for (iter = p->changelogs; iter; iter = iter->next) { entry = (ChangelogEntry *) iter->data; sqlite3_bind_int (handle, 1, p->pkgKey); sqlite3_bind_text (handle, 2, entry->author, -1, SQLITE_STATIC); sqlite3_bind_int (handle, 3, entry->date); sqlite3_bind_text (handle, 4, entry->changelog, -1, SQLITE_STATIC); rc = sqlite3_step (handle); sqlite3_reset (handle); if (rc != SQLITE_DONE) { g_critical ("Error adding changelog to SQL: %s", sqlite3_errmsg (db)); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -