⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 db.c

📁 yum-metadata-parser 一个用C写的yum仓库解析库
💻 C
📖 第 1 页 / 共 2 页
字号:
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 + -