+
+struct conf_metadata * conf_metadata_assign(NMEM nmem,
+ struct conf_metadata * metadata,
+ const char *name,
+ enum conf_metadata_type type,
+ enum conf_metadata_merge merge,
+ int brief,
+ int termlist,
+ int rank,
+ int sortkey_offset)
+{
+ if (!nmem || !metadata || !name)
+ return 0;
+
+ metadata->name = nmem_strdup(nmem, name);
+
+ // enforcing that merge_range is always type_year
+ if (merge == Metadata_merge_range)
+ metadata->type = Metadata_type_year;
+ else
+ metadata->type = type;
+
+ // enforcing that type_year is always range_merge
+ if (metadata->type == Metadata_type_year)
+ metadata->merge = Metadata_merge_range;
+ else
+ metadata->merge = merge;
+
+ metadata->brief = brief;
+ metadata->termlist = termlist;
+ metadata->rank = rank;
+ metadata->sortkey_offset = sortkey_offset;
+ return metadata;
+}
+
+
+struct conf_sortkey * conf_sortkey_assign(NMEM nmem,
+ struct conf_sortkey * sortkey,
+ const char *name,
+ enum conf_sortkey_type type)
+{
+ if (!nmem || !sortkey || !name)
+ return 0;
+
+ sortkey->name = nmem_strdup(nmem, name);
+ sortkey->type = type;
+
+ return sortkey;
+}
+
+
+struct conf_service * conf_service_create(NMEM nmem,
+ int num_metadata, int num_sortkeys)
+{
+ struct conf_service * service = 0;
+
+ //assert(nmem);
+
+ service = nmem_malloc(nmem, sizeof(struct conf_service));
+
+ service->num_metadata = num_metadata;
+ service->metadata = 0;
+ if (service->num_metadata)
+ service->metadata
+ = nmem_malloc(nmem,
+ sizeof(struct conf_metadata) * service->num_metadata);
+ service->num_sortkeys = num_sortkeys;
+ service->sortkeys = 0;
+ if (service->num_sortkeys)
+ service->sortkeys
+ = nmem_malloc(nmem,
+ sizeof(struct conf_sortkey) * service->num_sortkeys);
+ return service;
+}
+
+struct conf_metadata* conf_service_add_metadata(NMEM nmem,
+ struct conf_service *service,
+ int field_id,
+ const char *name,
+ enum conf_metadata_type type,
+ enum conf_metadata_merge merge,
+ int brief,
+ int termlist,
+ int rank,
+ int sortkey_offset)
+{
+ struct conf_metadata * md = 0;
+
+ if (!service || !service->metadata || !service->num_metadata
+ || field_id < 0 || !(field_id < service->num_metadata))
+ return 0;
+
+ //md = &((service->metadata)[field_id]);
+ md = service->metadata + field_id;
+ md = conf_metadata_assign(nmem, md, name, type, merge,
+ brief, termlist, rank, sortkey_offset);
+ return md;
+}
+
+
+struct conf_sortkey * conf_service_add_sortkey(NMEM nmem,
+ struct conf_service *service,
+ int field_id,
+ const char *name,
+ enum conf_sortkey_type type)
+{
+ struct conf_sortkey * sk = 0;
+
+ if (!service || !service->sortkeys || !service->num_sortkeys
+ || field_id < 0 || !(field_id < service->num_sortkeys))
+ return 0;
+
+ //sk = &((service->sortkeys)[field_id]);
+ sk = service->sortkeys + field_id;
+ sk = conf_sortkey_assign(nmem, sk, name, type);
+
+ return sk;
+}
+
+
+int conf_service_metadata_field_id(struct conf_service *service,
+ const char * name)
+{
+ int i = 0;
+
+ if (!service || !service->metadata || !service->num_metadata)
+ return -1;
+
+ for(i = 0; i < service->num_metadata; i++) {
+ if (!strcmp(name, (service->metadata[i]).name))
+ return i;
+ }
+
+ return -1;
+};
+
+
+int conf_service_sortkey_field_id(struct conf_service *service,
+ const char * name)
+{
+ int i = 0;
+
+ if (!service || !service->sortkeys || !service->num_sortkeys)
+ return -1;
+
+ for(i = 0; i < service->num_sortkeys; i++) {
+ if (!strcmp(name, (service->sortkeys[i]).name))
+ return i;
+ }
+
+ return -1;
+};
+
+
+