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