[darwinbuild-changes] [206] trunk

source_changes at macosforge.org source_changes at macosforge.org
Wed Oct 4 01:58:36 PDT 2006


Revision: 206
          http://trac.macosforge.org/projects/darwinbuild/changeset/206
Author:   kevin
Date:     2006-10-04 01:58:36 -0700 (Wed, 04 Oct 2006)

Log Message:
-----------
- added new groups API

Modified Paths:
--------------
    trunk/CHANGES
    trunk/darwinxref/DBDataStore.c
    trunk/darwinxref/DBPlugin.h

Modified: trunk/CHANGES
===================================================================
--- trunk/CHANGES	2005-08-29 23:33:34 UTC (rev 205)
+++ trunk/CHANGES	2006-10-04 08:58:36 UTC (rev 206)
@@ -2,6 +2,7 @@
 -----------------------------------
 
 Release X.Y.Z [now]
+	- darwinxref: added new groups API
 	- darwinxref: added default handlers for plugins
 	- darwinbuild: redo_prebinding to create a canonical Mach-O prior to
 	  registering for reproducible manifests.

Modified: trunk/darwinxref/DBDataStore.c
===================================================================
--- trunk/darwinxref/DBDataStore.c	2005-08-29 23:33:34 UTC (rev 205)
+++ trunk/darwinxref/DBDataStore.c	2006-10-04 08:58:36 UTC (rev 206)
@@ -226,11 +226,12 @@
 		__DBDataStore = NULL;
 	}
 
-	char* table = "CREATE TABLE properties (build TEXT, project TEXT, property TEXT, key TEXT, value TEXT)";
-	char* index = "CREATE INDEX properties_index ON properties (build, project, property, key, value)";
-	SQL_NOERR(table);
-	SQL_NOERR(index);
-	
+	SQL_NOERR("CREATE TABLE properties (build TEXT, project TEXT, property TEXT, key TEXT, value TEXT)");
+	SQL_NOERR("CREATE INDEX properties_index ON properties (build, project, property, key, value)");
+
+	SQL_NOERR("CREATE TABLE groups (build TEXT, name TEXT, member TEXT)");
+	SQL_NOERR("CREATE INDEX groups_index ON groups (build, name, member)");
+
 	return 0;
 }
 
@@ -653,6 +654,10 @@
 
 CFDictionaryRef DBCopyBuildPlist(CFStringRef build) {
 	CFMutableDictionaryRef plist = (CFMutableDictionaryRef)DBCopyProjectPlist(build, NULL);
+
+	CFDictionarySetValue(plist, CFSTR("build"), build);
+
+	// Generate projects dictionary
 	CFMutableDictionaryRef projects = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
 	CFArrayRef names = DBCopyProjectNames(build);
 	CFIndex i, count = CFArrayGetCount(names);
@@ -662,8 +667,26 @@
 		CFDictionaryAddValue(projects, name, proj);
 		CFRelease(proj);
 	}
-	CFDictionarySetValue(plist, CFSTR("build"), build);
 	CFDictionarySetValue(plist, CFSTR("projects"), projects);
+	CFRelease(projects);
+	CFRelease(names);
+	
+	// Generate groups dictionary
+	CFMutableDictionaryRef groups = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+	names = DBCopyGroupNames(build);
+	count = CFArrayGetCount(names);
+	for (i = 0; i < count; ++i) {
+		CFStringRef name = CFArrayGetValueAtIndex(names, i);
+		CFArrayRef members = DBCopyGroupMembers(build, name);
+		CFDictionaryAddValue(groups, name, members);
+		CFRelease(members);
+	}
+	if (CFDictionaryGetCount(groups) > 0) {
+		CFDictionarySetValue(plist, CFSTR("groups"), groups);
+	}
+	CFRelease(groups);
+	CFRelease(names);
+	
 	return plist;
 }
 
@@ -680,11 +703,16 @@
 	CFStringRef project = CFDictionaryGetValue(plist, CFSTR("name"));
 	if (!project) project = projectParam;
 	CFDictionaryRef projects = CFDictionaryGetValue(plist, CFSTR("projects"));
+	CFDictionaryRef groups = CFDictionaryGetValue(plist, CFSTR("groups"));
 		
 	if (projects && CFGetTypeID(projects) != CFDictionaryGetTypeID()) {
 		fprintf(stderr, "Error: projects must be a dictionary.\n");
 		return -1;
 	}
+	if (groups && CFGetTypeID(groups) != CFDictionaryGetTypeID()) {
+		fprintf(stderr, "Error: groups must be a dictionary.\n");
+		return -1;
+	}
 
 	CFArrayRef props = dictionaryGetSortedKeys(plist);
 
@@ -722,7 +750,7 @@
 		CFStringRef prop = CFArrayGetValueAtIndex(props, i);
 		
 		// These are more like pseudo-properties
-		if (CFEqual(prop, CFSTR("build")) || CFEqual(prop, CFSTR("projects"))) continue;
+		if (CFEqual(prop, CFSTR("build")) || CFEqual(prop, CFSTR("projects")) || CFEqual(prop, CFSTR("groups"))) continue;
 		
 		CFTypeRef value = CFDictionaryGetValue(plist, prop);
 		res = DBSetProp(build, project, prop, value);
@@ -741,13 +769,75 @@
 		CFRelease(projectNames);
 	}
 	if (props) CFRelease(props);
+	
+	//
+	// Load the groups dictionary if present
+	//
+	if (groups) {
+		// delete old groups so we don't leave any stale entries
+		char* cbuild = strdup_cfstr(build);
+		SQL("DELETE FROM groups WHERE build=%Q", cbuild);
+		free(cbuild);
 
+		CFArrayRef groupNames = dictionaryGetSortedKeys(groups);
+		CFIndex i, count = CFArrayGetCount(groupNames);
+		for (i = 0; i < count; ++i) {
+			CFStringRef name = CFArrayGetValueAtIndex(groupNames, i);
+			CFArrayRef members = CFDictionaryGetValue(groups, name);
+			DBSetGroupMembers(build, name, members);
+		}
+		CFRelease(groupNames);
+	}
+
 	DBCommitTransaction();
 
 	return res;
 }
 
 
+CFArrayRef DBCopyGroupNames(CFStringRef build) {
+	char* cbuild = strdup_cfstr(build);
+	CFArrayRef res = SQL_CFARRAY("SELECT DISTINCT name FROM groups WHERE build=%Q ORDER BY name", cbuild);
+	free(cbuild);
+	return res;
+}
+
+// copy group members for a single build (no inheritance)
+static CFArrayRef _DBCopyGroupMembers(CFStringRef build, CFStringRef group) {
+	char* cbuild = strdup_cfstr(build);
+	char* cgroup = strdup_cfstr(group);
+	CFArrayRef res = SQL_CFARRAY("SELECT DISTINCT member FROM groups WHERE build=%Q AND name=%Q ORDER BY member", cbuild, cgroup);
+	free(cbuild);
+	free(cgroup);
+	return res;
+}
+
+CFArrayRef DBCopyGroupMembers(CFStringRef build, CFStringRef group) {
+	CFArrayRef res = NULL;
+	do {
+		res = _DBCopyGroupMembers(build, group);
+		if (res) break;
+		
+		build = _DBCopyPropString(build, NULL, CFSTR("inherits"));
+	} while (build != NULL);
+	return res;
+}
+
+int DBSetGroupMembers(CFStringRef build, CFStringRef group, CFArrayRef members) {
+	char* cbuild = strdup_cfstr(build);
+	char* cgroup = strdup_cfstr(group);
+	SQL("DELETE FROM groups WHERE build=%Q AND name=%Q", cbuild, cgroup);
+	CFIndex i, count = CFArrayGetCount(members);
+	for (i = 0; i < count; ++i) {
+		char* cmember = strdup_cfstr(CFArrayGetValueAtIndex(members, i));
+		SQL("INSERT INTO groups (build,name,member) VALUES (%Q, %Q, %Q)", cbuild, cgroup, cmember);
+		free(cmember);
+	}
+	free(cbuild);
+	free(cgroup);
+	return 0;
+}
+
 // NOT THREAD SAFE
 int DBBeginTransaction() {
 	++__nestedTransactions;

Modified: trunk/darwinxref/DBPlugin.h
===================================================================
--- trunk/darwinxref/DBPlugin.h	2005-08-29 23:33:34 UTC (rev 205)
+++ trunk/darwinxref/DBPlugin.h	2006-10-04 08:58:36 UTC (rev 206)
@@ -172,6 +172,10 @@
 */
 int DBSetPlist(CFStringRef build, CFStringRef project, CFPropertyListRef plist);
 
+CFArrayRef DBCopyGroupNames(CFStringRef build);
+CFArrayRef DBCopyGroupMembers(CFStringRef build, CFStringRef group);
+int DBSetGroupMembers(CFStringRef build, CFStringRef group, CFArrayRef members);
+
 int DBBeginTransaction();
 int DBCommitTransaction();
 int DBRollbackTransaction();

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/darwinbuild-changes/attachments/20061004/63677092/attachment-0001.html


More information about the darwinbuild-changes mailing list