PERFORCE change 185747 for review
David Forsythe
dforsyth at FreeBSD.org
Sat Nov 13 19:29:42 UTC 2010
http://p4web.freebsd.org/@@185747?ac=10
Change 185747 by dforsyth at 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,
More information about the p4-projects
mailing list