GPtrArray *mdb_read_catalog (MdbHandle *mdb, int objtype) { MdbCatalogEntry *entry, msysobj; MdbTableDef *table; char obj_id[256]; char obj_name[256]; char obj_type[256]; char obj_flags[256]; int type; if (!mdb) return NULL; if (mdb->catalog) mdb_free_catalog(mdb); mdb->catalog = g_ptr_array_new(); mdb->num_catalog = 0; /* dummy up a catalog entry so we may read the table def */ memset(&msysobj, 0, sizeof(MdbCatalogEntry)); msysobj.mdb = mdb; msysobj.object_type = MDB_TABLE; msysobj.table_pg = 2; strcpy(msysobj.object_name, "MSysObjects"); /* mdb_table_dump(&msysobj); */ table = mdb_read_table(&msysobj); if (!table) return NULL; mdb_read_columns(table); mdb_bind_column_by_name(table, "Id", obj_id, NULL); mdb_bind_column_by_name(table, "Name", obj_name, NULL); mdb_bind_column_by_name(table, "Type", obj_type, NULL); mdb_bind_column_by_name(table, "Flags", obj_flags, NULL); mdb_rewind_table(table); while (mdb_fetch_row(table)) { type = atoi(obj_type); if (objtype==MDB_ANY || type == objtype) { entry = (MdbCatalogEntry *) g_malloc0(sizeof(MdbCatalogEntry)); entry->mdb = mdb; strcpy(entry->object_name, obj_name); entry->object_type = (type & 0x7F); entry->table_pg = atol(obj_id) & 0x00FFFFFF; entry->flags = atol(obj_flags); mdb->num_catalog++; g_ptr_array_add(mdb->catalog, entry); } } mdb_free_tabledef(table); return mdb->catalog; }
/** * mdb_close: * @mdb: Handle to open MDB database file * * Dereferences MDB file, closes if reference count is 0, and destroys handle. * **/ void mdb_close(MdbHandle *mdb) { if (!mdb) return; mdb_free_catalog(mdb); g_free(mdb->stats); g_free(mdb->backend_name); if (mdb->f) { if (mdb->f->refs > 1) { mdb->f->refs--; } else { if (mdb->f->fd != -1) close(mdb->f->fd); g_free(mdb->f->filename); g_free(mdb->f); } } g_free(mdb); }