X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Frecord.c;h=19b06d7395ac39f4a0275fa0370a850c85dd6522;hb=c61904671e969a32a7f9d38a523f7abaa2b371fd;hp=b1446ceb8ac4dc901ebf82698c42c7a4793abea5;hpb=18701a2fcad5171b03a76ceda18702831eb90850;p=pazpar2-moved-to-github.git diff --git a/src/record.c b/src/record.c index b1446ce..19b06d7 100644 --- a/src/record.c +++ b/src/record.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2008 Index Data + Copyright (C) Index Data Pazpar2 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -26,14 +26,12 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #endif -//#define CONFIG_NOEXTERNS #include "pazpar2_config.h" +#include "client.h" #include "record.h" - - -union data_types * data_types_assign(NMEM nmem, - union data_types ** data1, +union data_types * data_types_assign(NMEM nmem, + union data_types ** data1, union data_types data2) { // assert(nmem); @@ -47,7 +45,7 @@ union data_types * data_types_assign(NMEM nmem, else *data1 = nmem_malloc(nmem, sizeof(union data_types)); } - + **data1 = data2; return *data1; } @@ -58,7 +56,9 @@ struct record * record_create(NMEM nmem, int num_metadata, int num_sortkeys, { struct record * record = 0; int i = 0; - + const char *name = client_get_id(client); + unsigned h = position; + // assert(nmem); record = nmem_malloc(nmem, sizeof(struct record)); @@ -66,128 +66,87 @@ struct record * record_create(NMEM nmem, int num_metadata, int num_sortkeys, record->next = 0; record->client = client; - record->metadata - = nmem_malloc(nmem, + record->metadata + = nmem_malloc(nmem, sizeof(struct record_metadata*) * num_metadata); for (i = 0; i < num_metadata; i++) record->metadata[i] = 0; - - record->sortkeys - = nmem_malloc(nmem, + + record->sortkeys + = nmem_malloc(nmem, sizeof(union data_types*) * num_sortkeys); for (i = 0; i < num_sortkeys; i++) record->sortkeys[i] = 0; record->position = position; - + + for (i = 0; name[i]; i++) + h = h * 65509 + ((unsigned char *) name)[i]; + + record->checksum = h; + return record; } struct record_metadata * record_metadata_create(NMEM nmem) { - struct record_metadata * rec_md + struct record_metadata * rec_md = nmem_malloc(nmem, sizeof(struct record_metadata)); rec_md->next = 0; + rec_md->attributes = 0; return rec_md; } -struct record_metadata * record_metadata_insert(NMEM nmem, - struct record_metadata ** rmd, - union data_types data) +int record_compare(struct record *r1, struct record *r2, + struct conf_service *service) { - struct record_metadata * tmp_rmd = 0; - // assert(nmem); - - if(!rmd) - return 0; - - // construct new record_metadata - tmp_rmd = nmem_malloc(nmem, sizeof(struct record_metadata)); - tmp_rmd->data = data; - - - // insert in *rmd's place, moving *rmd one down the list - tmp_rmd->next = *rmd; - *rmd = tmp_rmd; - - return *rmd; -} - -struct record_metadata * record_add_metadata_field_id(NMEM nmem, - struct record * record, - int field_id, - union data_types data) -{ - if (field_id < 0 || !record || !record->metadata) - return 0; - - return record_metadata_insert(nmem, &(record->metadata[field_id]), data); -} - - -struct record_metadata * record_add_metadata(NMEM nmem, - struct record * record, - struct conf_service * service, - const char * name, - union data_types data) -{ - int field_id = 0; - - if (!record || !record->metadata || !service || !name) - return 0; - - field_id = conf_service_metadata_field_id(service, name); - - if (-1 == field_id) - return 0; - - return record_metadata_insert(nmem, &(record->metadata[field_id]), data); -} - - - - - - -union data_types * record_assign_sortkey_field_id(NMEM nmem, - struct record * record, - int field_id, - union data_types data) -{ - if (field_id < 0 || !record || !record->sortkeys) - return 0; - - return data_types_assign(nmem, &(record->sortkeys[field_id]), data); -} - - - -union data_types * record_assign_sortkey(NMEM nmem, - struct record * record, - struct conf_service * service, - const char * name, - union data_types data) -{ - int field_id = 0; - - if (!record || !service || !name) - return 0; - - field_id = conf_service_sortkey_field_id(service, name); - - if (!(-1 < field_id) || !(field_id < service->num_sortkeys)) - return 0; - - return record_assign_sortkey_field_id(nmem, record, field_id, data); + int i; + for (i = 0; i < service->num_metadata; i++) + { + struct conf_metadata *ser_md = &service->metadata[i]; + enum conf_metadata_type type = ser_md->type; + + struct record_metadata *m1 = r1->metadata[i]; + struct record_metadata *m2 = r2->metadata[i]; + while (m1 && m2) + { + switch (type) + { + case Metadata_type_generic: + case Metadata_type_skiparticle: + if (strcmp(m1->data.text.disp, m2->data.text.disp)) + return 0; + break; + case Metadata_type_date: + case Metadata_type_year: + if (m1->data.number.min != m2->data.number.min || + m1->data.number.max != m2->data.number.max) + return 0; + break; + case Metadata_type_float: + if (m1->data.fnumber != m2->data.fnumber) + return 0; + case Metadata_type_position: + case Metadata_type_relevance: + case Metadata_type_retrieval: + break; + } + m1 = m1->next; + m2 = m2->next; + } + if (m1 || m2) + return 0; + } + return 1; } - - /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab */ +