From owner-p4-projects@FreeBSD.ORG Wed Aug 15 05:59:35 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1C1E016A41B; Wed, 15 Aug 2007 05:59:35 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C1A2316A419 for ; Wed, 15 Aug 2007 05:59:34 +0000 (UTC) (envelope-from gcooper@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id B09B813C478 for ; Wed, 15 Aug 2007 05:59:34 +0000 (UTC) (envelope-from gcooper@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l7F5xYu3063258 for ; Wed, 15 Aug 2007 05:59:34 GMT (envelope-from gcooper@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l7F5xXW2063255 for perforce@freebsd.org; Wed, 15 Aug 2007 05:59:33 GMT (envelope-from gcooper@FreeBSD.org) Date: Wed, 15 Aug 2007 05:59:33 GMT Message-Id: <200708150559.l7F5xXW2063255@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to gcooper@FreeBSD.org using -f From: Garrett Cooper To: Perforce Change Reviews Cc: Subject: PERFORCE change 125164 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 15 Aug 2007 05:59:35 -0000 http://perforce.freebsd.org/chv.cgi?CH=125164 Change 125164 by gcooper@optimus-revised_pkgtools on 2007/08/15 05:59:15 Filling in more blanks with the BDB DB API. Affected files ... .. //depot/projects/soc2007/revised_fbsd_pkgtools/v2/lib/db/api.c#2 edit .. //depot/projects/soc2007/revised_fbsd_pkgtools/v2/lib/db/api.h#2 edit Differences ... ==== //depot/projects/soc2007/revised_fbsd_pkgtools/v2/lib/db/api.c#2 (text+ko) ==== @@ -1,42 +1,229 @@ #include "lib/db/api.h" +/** + * @brief: Merge +CONTENTS information or similar output into file database + * @return 0 on success + * @return 1 on failure + */ +int +build_filedb(DB *database, const char *filedb_filename, const char **file_manifest_filenames) +{ + + int build_db_exit_status; + + /** + * Create temporary store for output conversion, + * and convert. + */ + char *file_data; + + /** + * Convert all entries to strings. + */ + build_db_exit_status = build_db(database, filedb_filename, file_data); + + return build_db_exit_status; + +} + +/** + * @brief Merge INDEX information into pkg database. + * @return 0 on success + * @return 1 on failure + */ int -build_filedb(DB *database, const char *filedb_filename, const char *file_manifest_filename) +build_pkgdb(DB *database, const char *pkgdb_filename, const char **index_filenames) { + int build_db_exit_status; + + /** + * Create temporary store for output conversion, + * and convert. + */ + char *pkg_data; + /** + * Convert all entries to strings. + */ + build_db_exit_status = build_db(database, pkgdb_filename, pkg_data); + return build_db_exit_status; } +/** + * @brief Create a database by first creating the header, then the + * cache, and return the database. + * @return 0 on success + * @return 1 on failure + */ int -build_pkgdb(DB *database, const char *pkgdb_filename, const char *index_filename) +build_db(DB *database, const char *db_filename, const char *data) { + int build_db_exit_status; + + build_db_exit_status = + dbopen(db_filename, O_CREAT | O_EXLOCK | O_EXCL | O_WRLOCK, 0644, DB_HASH, NULL); + + /** + * dbopen was successful. + */ + if(0 == build_db_exit_status) { + + /** + * Try initializing the database header. + */ + build_db_exit_status = initialize_database_header(database); + + /** + * Database header creation was good. Continue by trying to + * create the cache. + */ + if(0 == build_db_exit_status) { + + build_db_exit_status = initialize_entry_cache(database); + + /** + * Database is fully built if build_db_exit_status == 0. + */ + + } + + } + /** + * Else dbopen was bunk -- return exit status. + */ + return build_db_exit_status; + } +/** + * @brief Cache recent entry into file database, substituting the + * current entry for the least recently cached one. + * @return 0 on success + * @return 1 on failure + */ int cache_file_entry(DB *database, const void *entry, const size_t entry_size) { + int cache_exit_status; + + + remove_lru_cache_entry(database, entry_size); + return cache_exit_status; } +/** + * @brief Cache recent entry into pkg database, substituting + * the current entry for the least recently cached one. + * @return 0 on success + * @return 1 on failure + */ int cache_pkg_entry(DB *database, const void *entry, const size_t entry_size) { + int cache_exit_status; + + + remove_lru_cache_entry(database, entry_size); + return cache_exit_status; } +/** + * @brief Remove least recently used cache entry to make room + * for another entry (the most recently used entry). + * @return -1 on no change + * @return 0 on success + * @return 1 on failure + */ int -flush_changes(DB *database, const void *entry_list, const size_t entry_size) +remove_lru_cache_entry(DB *database, const size_t entry_size) +{ + + DBT + /** + * Cache updating related items. + * + * - cache_retrieved is the initial information. + * - cache_displaced is the information which will + * be copied and replace the old cache info. + */ + cache_query, + cache_retrieved, + cache_displaced, + /** + * Header related items. + * + * - header_query is the query info for the + * header. + * - header_retrieved is the returned header from + * the database + */ + header_query = { __HEADER_TITLE, sizeof(__HEADER_TITLE) }, + header_retrieved; + + int db_exit_status = database->get(, 0); + + /** + * Ok, there is a cache. Let's proceed. + */ + if(0 == db_exit_status) { + + + + } + + return db_exit_status; + +} + +/** + * @brief Setup the database header; this should only be + * executed after building the database. + * @return 0 on success + * @return 1 on failure + */ +int +initialize_database_header(DB *database) +{ + + + +} + +/** + * @brief Setup the entry cache; this should only be executed + * after building the database. + * @return 0 on success + * @return 1 on failure + */ +int +initialize_entry_cache(DB *database) +{ + + + +} + +/** + * @brief Cache recent entry into pkg database. + * @return 0 on success + * @return 1 on failure + */ +int +flush_changes(DB *database, const void **entry_list, const size_t entry_size) { @@ -44,20 +231,114 @@ } +/** + * @brief Search for file in file database. + * @return file_entry if found. + * @return NULL if not found. + */ void* file_search(DB *database, const char *key) { + file_entry *entry; + db_search(entry, sizeof(file_entry), DB, key); + return entry; } +/** + * @brief Search for package in pkg database. + * @return the pkg_entry if found. + * @return NULL if not found. + */ void* pkg_search(DB *database, const char *key) { + pkg_entry *entry; + + db_search(entry, sizeof(pkg_entry), DB, key); + return entry; + +} +/** + * @brief Generic search method through a database, common + * to both searching the file and pkg databases. + * @return 1 on successful find + * @return 0 on successful find. + * @return 1 on lack of resources (memset / malloc failed) + * or unknown BDB failure (check errno?) + * + */ + +/** + * Should the entries be globbable/pattern searchable? If + * so, then there would be more entires that would need to + * be returned than just 1. + */ +int +db_search(void *found_entry, const size_t found_entry_size, DB *database, const char *key) +{ + + DBT search_key = { key, sizeof(key) }; + DBT db_found_entry = calloc(1, sizeof(DBT)); + + int exit_status; + + /** + * The search subroutine. + */ + int db_get_exit_status = database->get(database, &search_key, &db_found_entry, 0); + + /** + * Success! We found it and everything passed in + * creating the DBT objects. + */ + if(0 == db_get_exit_status) { + + assert(found_entry_size == db_found_entry->size); + + exit_status = 1; + + /** + * If the malloc was successful, continue on + * with the memcpy. + */ + if( NULL != (found_entry = malloc(found_entry_size)) ) { + + /** + * If the memset was successful, then the + * copy was good and the retrieval was + * complete. + */ + if( NULL != (found_entry = memset( found_entry, + db_found_entry->data, + db_found_entry->size)) + ) { + exit_status = 0; + } + + } + + } + /** + * Else if the key's positive, there was an + * unknown BDB error. + */ + else if(0 < db_get_exit_status) { + exit_status = 1; + } + /** + * Else, the key wasn't found. + */ + else { + exit_status = -1; + } + + return exit_status; } ==== //depot/projects/soc2007/revised_fbsd_pkgtools/v2/lib/db/api.h#2 (text+ko) ==== @@ -7,11 +7,36 @@ #include #include +#include + +/** + * The database will appear something like this (abstractly): + * + * __HEADER + * __DATA_STORE (keyed) + * __ENTRY_CACHE (keyed) + * + * Where the __HEADER is like the following: + * + * + */ + +/** + * + * The title for the cache field. + */ +#define __CACHE_FIELD_TITLE "__CACHE" + +/** + * The title for the header field. + */ +#define __HEADER_FIELD_TITLE "__HEADER" + typedef struct { DB bdb_obj; - int (*build_db) (DB*, const char*, const char*); + int (*build_db) (DB*, const char*, const char**); int (*cache_entry) (DB*, const void*, const size_t); int (*flush_changes)(DB*, const void*, const size_t); int (*init_db) (DB*, const char*); @@ -19,19 +44,27 @@ } db; -/** BUILD DATABASES FROM FILES **/ -int build_filedb(DB*, const char*, const char*); -int build_pkgdb(DB*, const char*, const char*); +/** Database building functions **/ +int build_filedb(DB*, const char*, const char**); +int build_pkgdb(DB*, const char*, const char**); -/** CACHE ENTRIES **/ +/** Cache maintenance functions **/ int cache_file_entry(DB*, const void* const size_t); int cache_pkg_entry(DB*, const void*, const size_t); -/** FLUSH CHANGES **/ +int remove_lru_cache_entry(DB*, const size_t); + +/** For initializing required fields in the databases **/ +int initialize_database_header(DB*); +int initialize_entry_cache(DB*); + +/** Functions for flushing changes **/ int flush_changes(DB*, const void*, const size_t); -/** SEARCH **/ +/** Functions for search databases **/ void* file_search(DB*, const char*); void* pkg_search(DB*, const char*); +int db_search(void*, const size_t, DB*, const char *); + #endif