cr_RepomdRecord * cr_repomd_record_copy(const cr_RepomdRecord *orig) { cr_RepomdRecord *rec; if (!orig) return NULL; rec = cr_repomd_record_new(orig->type, NULL); rec->location_real = cr_safe_string_chunk_insert(rec->chunk, orig->location_real); rec->location_href = cr_safe_string_chunk_insert(rec->chunk, orig->location_href); rec->location_base = cr_safe_string_chunk_insert(rec->chunk, orig->location_base); rec->checksum = cr_safe_string_chunk_insert(rec->chunk, orig->checksum); rec->checksum_type = cr_safe_string_chunk_insert(rec->chunk, orig->checksum_type); rec->checksum_open = cr_safe_string_chunk_insert(rec->chunk, orig->checksum_open); rec->checksum_open_type = cr_safe_string_chunk_insert(rec->chunk, orig->checksum_open_type); rec->timestamp = orig->timestamp; rec->size = orig->size; rec->size_open = orig->size_open; rec->db_ver = orig->db_ver; return rec; }
static int repomdrecord_init(_RepomdRecordObject *self, PyObject *args, G_GNUC_UNUSED PyObject *kwds) { char *type = NULL, *path = NULL; if (!PyArg_ParseTuple(args, "|zz:repomdrecord_init", &type, &path)) return -1; /* Free all previous resources when reinitialization */ if (self->record) cr_repomd_record_free(self->record); /* Init */ self->record = cr_repomd_record_new(type, path); if (self->record == NULL) { PyErr_SetString(CrErr_Exception, "RepomdRecord initialization failed"); return -1; } return 0; }
static gboolean compress_sqlite_dbs(const gchar *tmp_out_repo, const gchar *pri_db_filename, cr_RepomdRecord **in_pri_db_rec, const gchar *fil_db_filename, cr_RepomdRecord **in_fil_db_rec, const gchar *oth_db_filename, cr_RepomdRecord **in_oth_db_rec, cr_CompressionType compression_type, cr_ChecksumType checksum_type, GError **err) { cr_CompressionTask *pri_db_task; cr_CompressionTask *fil_db_task; cr_CompressionTask *oth_db_task; const char *sqlite_compression_suffix; cr_RepomdRecord *pri_db_rec = NULL; cr_RepomdRecord *fil_db_rec = NULL; cr_RepomdRecord *oth_db_rec = NULL; // Prepare thread pool for compression tasks GThreadPool *compress_pool = g_thread_pool_new(cr_compressing_thread, NULL, 3, FALSE, NULL); // Prepare output filenames sqlite_compression_suffix = cr_compression_suffix(compression_type); gchar *pri_db_name = g_strconcat(tmp_out_repo, "/primary.sqlite", sqlite_compression_suffix, NULL); gchar *fil_db_name = g_strconcat(tmp_out_repo, "/filelists.sqlite", sqlite_compression_suffix, NULL); gchar *oth_db_name = g_strconcat(tmp_out_repo, "/other.sqlite", sqlite_compression_suffix, NULL); // Prepare compression tasks pri_db_task = cr_compressiontask_new(pri_db_filename, pri_db_name, compression_type, checksum_type, 1, NULL); g_thread_pool_push(compress_pool, pri_db_task, NULL); fil_db_task = cr_compressiontask_new(fil_db_filename, fil_db_name, compression_type, checksum_type, 1, NULL); g_thread_pool_push(compress_pool, fil_db_task, NULL); oth_db_task = cr_compressiontask_new(oth_db_filename, oth_db_name, compression_type, checksum_type, 1, NULL); g_thread_pool_push(compress_pool, oth_db_task, NULL); // Wait till all tasks are complete and free the thread pool g_thread_pool_free(compress_pool, FALSE, TRUE); // Remove uncompressed DBs cr_rm(pri_db_filename, CR_RM_FORCE, NULL, NULL); cr_rm(fil_db_filename, CR_RM_FORCE, NULL, NULL); cr_rm(oth_db_filename, CR_RM_FORCE, NULL, NULL); // Prepare repomd records pri_db_rec = cr_repomd_record_new("primary_db", pri_db_name); fil_db_rec = cr_repomd_record_new("filelists_db", fil_db_name); oth_db_rec = cr_repomd_record_new("other_db", oth_db_name); *in_pri_db_rec = pri_db_rec; *in_fil_db_rec = fil_db_rec; *in_oth_db_rec = oth_db_rec; // Free paths to compressed files g_free(pri_db_name); g_free(fil_db_name); g_free(oth_db_name); // Fill repomd records from stats gathered during compression cr_repomd_record_load_contentstat(pri_db_rec, pri_db_task->stat); cr_repomd_record_load_contentstat(fil_db_rec, fil_db_task->stat); cr_repomd_record_load_contentstat(oth_db_rec, oth_db_task->stat); // Free the compression tasks cr_compressiontask_free(pri_db_task, NULL); cr_compressiontask_free(fil_db_task, NULL); cr_compressiontask_free(oth_db_task, NULL); // Prepare thread pool for repomd record filling tasks GThreadPool *fill_pool = g_thread_pool_new(cr_repomd_record_fill_thread, NULL, 3, FALSE, NULL); // Prepare the tasks themselves cr_RepomdRecordFillTask *pri_db_fill_task; cr_RepomdRecordFillTask *fil_db_fill_task; cr_RepomdRecordFillTask *oth_db_fill_task; pri_db_fill_task = cr_repomdrecordfilltask_new(pri_db_rec, checksum_type, NULL); g_thread_pool_push(fill_pool, pri_db_fill_task, NULL); fil_db_fill_task = cr_repomdrecordfilltask_new(fil_db_rec, checksum_type, NULL); g_thread_pool_push(fill_pool, fil_db_fill_task, NULL); oth_db_fill_task = cr_repomdrecordfilltask_new(oth_db_rec, checksum_type, NULL); g_thread_pool_push(fill_pool, oth_db_fill_task, NULL); // Wait till the all tasks are finished and free the pool g_thread_pool_free(fill_pool, FALSE, TRUE); // Clear the tasks cr_repomdrecordfilltask_free(pri_db_fill_task, NULL); cr_repomdrecordfilltask_free(fil_db_fill_task, NULL); cr_repomdrecordfilltask_free(oth_db_fill_task, NULL); return TRUE; }