summaryrefslogtreecommitdiffstats
path: root/collection/collection.c
diff options
context:
space:
mode:
authorDmitri Pal <dpal@redhat.com>2009-10-25 13:21:24 -0400
committerStephen Gallagher <sgallagh@redhat.com>2009-12-10 17:20:26 -0500
commit2658ad549319d664cb308cf5852c7cdb55a7a601 (patch)
treede4c155fea6afd0e434f06cba9abeecb81504d06 /collection/collection.c
parent8ee482cfeaf83bfbfd15d8c9e6c660793b43bbf3 (diff)
downloadding-libs2-2658ad549319d664cb308cf5852c7cdb55a7a601.tar.gz
ding-libs2-2658ad549319d664cb308cf5852c7cdb55a7a601.tar.xz
ding-libs2-2658ad549319d664cb308cf5852c7cdb55a7a601.zip
COLLECTION Create reference to the top level collection
This patch adds ability to create a reference to the top level collection. Previously one could get reference only to collection inside other collection. With this change it becomes possible to have two pointers to the same top level collection from multiple places. COLLECTION Adding comment. COLLECTION: Some tracing
Diffstat (limited to 'collection/collection.c')
-rw-r--r--collection/collection.c49
1 files changed, 30 insertions, 19 deletions
diff --git a/collection/collection.c b/collection/collection.c
index 27dee83..c8a0077 100644
--- a/collection/collection.c
+++ b/collection/collection.c
@@ -1171,7 +1171,9 @@ static void col_delete_collection(struct collection_item *ci)
return;
}
- TRACE_INFO_STRING("Real work to do","");
+ TRACE_INFO_STRING("Real work to do", "");
+ TRACE_INFO_STRING("Property", ci->property);
+ TRACE_INFO_NUMBER("Next item", ci->next);
col_delete_collection(ci->next);
@@ -2247,8 +2249,11 @@ void col_destroy_collection(struct collection_item *ci)
return;
}
+ TRACE_INFO_STRING("Name:", ci->property);
+
/* Collection can be referenced by other collection */
header = (struct collection_header *)(ci->data);
+ TRACE_INFO_NUMBER("Reference count:", header->reference_count);
if (header->reference_count > 1) {
TRACE_INFO_STRING("Dereferencing a referenced collection.", "");
header->reference_count--;
@@ -2376,29 +2381,35 @@ int col_get_collection_reference(struct collection_item *ci,
if ((ci == NULL) ||
(ci->type != COL_TYPE_COLLECTION) ||
- (acceptor == NULL) ||
- (collection_to_find == NULL)) {
+ (acceptor == NULL)) {
TRACE_ERROR_NUMBER("Invalid parameter - returning error",EINVAL);
return EINVAL;
}
- /* Find a sub collection */
- TRACE_INFO_STRING("We are given subcollection name - search it:",
- collection_to_find);
- error = col_find_item_and_do(ci, collection_to_find,
- COL_TYPE_COLLECTIONREF,
- COL_TRAVERSE_DEFAULT,
- col_get_subcollection,
- (void *)(&subcollection),
- COLLECTION_ACTION_FIND);
- if (error) {
- TRACE_ERROR_NUMBER("Search failed returning error", error);
- return error;
- }
+ if (collection_to_find) {
+ /* Find a sub collection */
+ TRACE_INFO_STRING("We are given subcollection name - search it:",
+ collection_to_find);
+ error = col_find_item_and_do(ci, collection_to_find,
+ COL_TYPE_COLLECTIONREF,
+ COL_TRAVERSE_DEFAULT,
+ col_get_subcollection,
+ (void *)(&subcollection),
+ COLLECTION_ACTION_FIND);
+ if (error) {
+ TRACE_ERROR_NUMBER("Search failed returning error", error);
+ return error;
+ }
- if (subcollection == NULL) {
- TRACE_ERROR_STRING("Search for subcollection returned NULL pointer", "");
- return ENOENT;
+ if (subcollection == NULL) {
+ TRACE_ERROR_STRING("Search for subcollection returned NULL pointer", "");
+ return ENOENT;
+ }
+ }
+ else {
+ /* Create reference to the same collection */
+ TRACE_INFO_STRING("Creating reference to the top level collection.", "");
+ subcollection = ci;
}
header = (struct collection_header *)subcollection->data;