Date: Sat, 13 Nov 2010 19:29:41 GMT From: David Forsythe <dforsyth@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 185747 for review Message-ID: <201011131929.oADJTfKm025150@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@185747?ac=10 Change 185747 by dforsyth@skunk on 2010/11/13 19:28:35 db boilerplate Affected files ... .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/database.c#12 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/freebsd_database_directorydb.c#12 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/freebsd_database_directorydb.h#11 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg.c#14 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg.h#14 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg_internal.h#9 edit .. //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg_types.h#7 edit .. //depot/projects/soc2010/dforsyth_libpkg/pkg_install/pkg_info/pkg_info.c#10 edit Differences ... ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/database.c#12 (text+ko) ==== @@ -20,6 +20,8 @@ #include "freebsd_database_directorydb.h" +static int _pkg_db_release(struct pkg_db *); + /* * Verify the magic value in a package database. If there is a mismatch, crash * the client application. @@ -32,6 +34,13 @@ } } +static int +_pkg_db_release(struct pkg_db *db) +{ + free(db); + return (PKG_OK); +} + struct pkg_db * pkg_db_create(void) { @@ -68,8 +77,17 @@ if (db->internal != NULL) if (db->finish(db) != PKG_OK) return (PKG_NOT_OK); - free(db); + _pkg_db_release(db); + return (PKG_OK); +} + +int +pkg_db_release(struct pkg_db *db) +{ + if (db->internal != NULL) + if (db->close(db) != PKG_OK) return (PKG_NOT_OK); + _pkg_db_release(db); return (PKG_OK); } @@ -121,9 +139,10 @@ int pkg_db_close(struct pkg_db *db) { - if (db->internal) return (db->close(db)); - - return (PKG_NOT_OK); + if (db->internal) + if (db->close(db) != PKG_OK) return (PKG_NOT_OK); + + return (PKG_OK); } struct pkg * @@ -132,6 +151,12 @@ { struct pkg *pkg; + /* + * XXX: This needs to be fixed. We can't be allocating some pkg objects + * here, and then allocating the list of pkg objects (for _pkgs) in the + * internal db. + */ + pkg = pkg_alloc(); if (pkg == NULL) { return (NULL); @@ -139,7 +164,7 @@ /* Do the add and set up pkg. */ if (db->add(db, pkg, name, origin, comment, description) != PKG_OK) { - pkg_release(pkg); + _pkg_release(pkg); return (NULL); } ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/freebsd_database_directorydb.c#12 (text+ko) ==== @@ -64,6 +64,7 @@ static int fbsd_directorydb_read_pkg(struct _directorydb *, struct pkg *, uint32_t); static int fbsd_directorydb_pkg_finish(struct pkg *); +static int fbsd_directorydb_pkg_release(struct pkg *); static char *read_file(const char *); static void fbsd_directorydb_pkg_setup(struct pkg_db *, struct pkg *, const char *); @@ -90,6 +91,14 @@ const char *, int); static int _fbsd_directorydb_resolve(const char *, int); +static int _directorydb_close_op(struct pkg_db *, int); + +static int fbsd_directorydb_resolve_all(struct _directorydb *, + int); + +static int ftsentcmp(const FTSENT *const *, + const FTSENT *const *); + #define PKG_DIRDB_MAGIC 0x11111111 #define DB_DIRDB_MAGIC 0x11111111 @@ -113,9 +122,60 @@ int fbsd_directorydb_close(struct pkg_db *db) { + return (_directorydb_close_op(db, 0)); +} + +int +fbsd_directorydb_finish(struct pkg_db *db) +{ + return (_directorydb_close_op(db, 1)); +} + +static int +_directorydb_close_op(struct pkg_db *db, int use_bak) +{ struct _directorydb *d = db->internal; + + if (fbsd_directorydb_resolve_all(d, use_bak) != PKG_OK) + return (PKG_NOT_OK); + free(d); - return (0); + db->internal = NULL; + + return (PKG_OK); +} + +static int +fbsd_directorydb_resolve_all(struct _directorydb *d, int use_bak) +{ + FTS *ftsp; + FTSENT *ftsent; + char *paths[2]; + + paths[0] = strdup(d->path); + paths[1] = NULL; + + ftsp = fts_open(paths, FTS_LOGICAL | FTS_NOCHDIR | FTS_NOSTAT, + ftsentcmp); + assert(ftsp != NULL); + + while ((ftsent = fts_read(ftsp)) != NULL) { + if (ftsent->fts_info != FTS_D || ftsent->fts_level != 1) + continue; + fts_set(ftsp, ftsent, FTS_SKIP); + + if (fbsd_directorydb_has_backup(d, ftsent->fts_name)) { + if (fbsd_directorydb_resolve(d, + ftsent->fts_name, use_bak) < 0) { + return (PKG_NOT_OK); + } + } + } + + fts_close(ftsp); + free(paths[0]); + + return (PKG_OK); } /* Open a "connection" to a directorydb. */ @@ -132,7 +192,6 @@ if (d == NULL) return (PKG_NOT_OK); strcpy(d->path, path); - printf("path: %s\n", d->path); db->magic = DB_DIRDB_MAGIC; @@ -147,6 +206,12 @@ pkg->magic = PKG_DIRDB_MAGIC; pkg->source = db; strcpy(pkg->key, key); + + /* + * Because of the nature of the freebsd package system, we can cheat + * here and set pkg->name to key. + */ + _pkg_set_name(pkg, key); /* Set up our callbacks. */ pkg->read_name = fbsd_directorydb_read_name; @@ -173,6 +238,7 @@ pkg->add_file = fbsd_directorydb_add_file; pkg->finish = fbsd_directorydb_pkg_finish; + pkg->release = fbsd_directorydb_pkg_release; } static int @@ -360,6 +426,22 @@ } int +fbsd_directorydb_pkg_release(struct pkg *pkg) +{ + struct pkg_db *db; + struct _directorydb *d; + + db = pkg->source; + d = db->internal; + + if (fbsd_directorydb_has_backup(d, pkg->key)) + if (fbsd_directorydb_resolve(d, pkg->key, 0) != PKG_OK) + return (PKG_NOT_OK); + + return (PKG_OK); +} + +int fbsd_directorydb_pkg_finish(struct pkg *pkg) { const char *key; @@ -375,8 +457,6 @@ if (fbsd_directorydb_has_backup(d, key)) fbsd_directorydb_resolve(d, key, 1); - pkg_release(pkg); - return (PKG_OK); } ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/freebsd_database_directorydb.h#11 (text+ko) ==== ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg.c#14 (text+ko) ==== @@ -44,8 +44,8 @@ return (calloc(1, sizeof(struct pkg))); } -void -pkg_release(struct pkg *pkg) +int +_pkg_release(struct pkg *pkg) { if (pkg->conflicts != NULL) pkg_conflict_list_finish(pkg->conflicts); @@ -54,6 +54,8 @@ if (pkg->files != NULL) pkg_file_list_finish(pkg->files); free(pkg); + + return (PKG_OK); } const char * @@ -241,7 +243,23 @@ int pkg_finish(struct pkg *pkg) { - return (pkg->finish(pkg)); + if (pkg->finish(pkg) == PKG_OK) { + _pkg_release(pkg); + return (PKG_OK); + } + + return (PKG_NOT_OK); +} + +int +pkg_release(struct pkg *pkg) +{ + if (pkg->release(pkg) == PKG_OK) { + _pkg_release(pkg); + return (PKG_OK); + } + + return (PKG_NOT_OK); } int @@ -254,7 +272,7 @@ while (!TAILQ_EMPTY(pkgs)) { pkg = TAILQ_FIRST(pkgs); TAILQ_REMOVE(pkgs, pkg, next); - if (pkg->finish(pkg) != PKG_OK) { + if (pkg_finish(pkg) != PKG_OK) { /* finish failed, put pkg back at the head of the list * and return not_ok. */ TAILQ_INSERT_HEAD(pkgs, pkg, next); ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg.h#14 (text+ko) ==== @@ -39,11 +39,16 @@ int pkg_db_close(struct pkg_db *); /* - * Release a a pkg_db object, closing it if it's open. + * Release a a pkg_db object, closing it if it's open (sync). */ int pkg_db_finish(struct pkg_db *); /* + * Release a db object, closing if its open (no sync). + */ +int pkg_db_release(struct pkg_db *); + +/* * Return a list of all the packages in a database. */ struct pkg_list *pkg_db_pkgs(struct pkg_db *); @@ -70,6 +75,11 @@ */ int pkg_finish(struct pkg *); +/* + * Release the resources for a pkg, not syncing any additions to its source. + */ +int pkg_release(struct pkg *); + int pkg_list_finish(struct pkg_list *); /* ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg_internal.h#9 (text+ko) ==== @@ -91,7 +91,7 @@ struct pkg *_pkg_create(uint32_t, void *); struct pkg *pkg_alloc(void); -void pkg_release(struct pkg *); +int _pkg_release(struct pkg *); void _pkg_set_name(struct pkg *, const char *); ==== //depot/projects/soc2010/dforsyth_libpkg/libpkg/pkg_types.h#7 (text+ko) ==== @@ -72,6 +72,7 @@ const char *); int (*finish) (struct pkg *); + int (*release) (struct pkg *); int (*parse) (struct pkg *, char *, const char *); ==== //depot/projects/soc2010/dforsyth_libpkg/pkg_install/pkg_info/pkg_info.c#10 (text+ko) ==== @@ -474,6 +474,8 @@ pkg_list_finish(pkgs); /* This is a read-only app, so just close. */ pkg_db_close(db); + pkg_db_release(db); + return (r); } @@ -557,12 +559,7 @@ struct pkg_file *file; if (FLAGGED(_c->show_flags, SHOW_INDEX)) - /* - * This is a case where we only need the name of this package - * and nothing else from the manifest, so let's cheat and use - * the key, which is name for fbsd_directorydb. - */ - printf("%-19s %s\n", pkg_key(pkg), pkg_comment(pkg)); + printf("%-19s %s\n", pkg_name(pkg), pkg_comment(pkg)); else { if (!_c->quiet) printf("%sInformation for %s:\n\n", _c->info_prefix,
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201011131929.oADJTfKm025150>