More work on sorting
[pazpar2-moved-to-github.git] / src / record.c
1 /* This file is part of Pazpar2.
2    Copyright (C) 2006-2011 Index Data
3
4 Pazpar2 is free software; you can redistribute it and/or modify it under
5 the terms of the GNU General Public License as published by the Free
6 Software Foundation; either version 2, or (at your option) any later
7 version.
8
9 Pazpar2 is distributed in the hope that it will be useful, but WITHOUT ANY
10 WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
18 */
19
20 #include <string.h>
21
22 #include <yaz/yaz-util.h>
23 #include <yaz/nmem.h>
24
25 #if HAVE_CONFIG_H
26 #include <config.h>
27 #endif
28
29 #include "pazpar2_config.h"
30 #include "record.h"
31
32 union data_types * data_types_assign(NMEM nmem, 
33                                      union data_types ** data1, 
34                                      union data_types data2)
35 {
36     // assert(nmem);
37
38     if (!data1)
39         return 0;
40
41     if (!*data1){
42         if (!nmem)
43             return 0;
44         else
45             *data1  = nmem_malloc(nmem, sizeof(union data_types));
46     }
47     
48     **data1 = data2;
49     return *data1;
50 }
51
52
53 struct record * record_create(NMEM nmem, int num_metadata, int num_sortkeys,
54                               struct client *client, int position)
55 {
56     struct record * record = 0;
57     int i = 0;
58     
59     // assert(nmem);
60
61     record = nmem_malloc(nmem, sizeof(struct record));
62
63     record->next = 0;
64     record->client = client;
65
66     record->metadata 
67         = nmem_malloc(nmem, 
68                       sizeof(struct record_metadata*) * num_metadata);
69     for (i = 0; i < num_metadata; i++)
70         record->metadata[i] = 0;
71     
72     record->sortkeys  
73         = nmem_malloc(nmem, 
74                       sizeof(union data_types*) * num_sortkeys);
75     for (i = 0; i < num_sortkeys; i++)
76         record->sortkeys[i] = 0;
77
78     record->position = position;
79     
80     return record;
81 }
82
83 struct record_metadata * record_metadata_create(NMEM nmem)
84 {
85     struct record_metadata * rec_md 
86         = nmem_malloc(nmem, sizeof(struct record_metadata));
87     rec_md->next = 0;
88     rec_md->attributes = 0;
89     return rec_md;
90 }
91
92
93 int record_compare(struct record *r1, struct record *r2,
94                    struct conf_service *service)
95 {
96     int i;
97     for (i = 0; i < service->num_metadata; i++)
98     {
99         struct conf_metadata *ser_md = &service->metadata[i];
100         enum conf_metadata_type type = ser_md->type;
101             
102         struct record_metadata *m1 = r1->metadata[i];
103         struct record_metadata *m2 = r2->metadata[i];
104         while (m1 && m2)
105         {
106             switch (type)
107             {
108             case Metadata_type_generic:
109                 if (strcmp(m1->data.text.disp, m2->data.text.disp))
110                     return 0;
111                 break;
112             case Metadata_type_date:
113             case Metadata_type_year:
114                 if (m1->data.number.min != m2->data.number.min ||
115                     m1->data.number.max != m2->data.number.max)
116                     return 0;
117                 break;
118             }
119             m1 = m1->next;
120             m2 = m2->next;
121         }
122         if (m1 || m2)
123             return 0;
124     }
125     return 1;
126 }
127
128 /*
129  * Local variables:
130  * c-basic-offset: 4
131  * c-file-style: "Stroustrup"
132  * indent-tabs-mode: nil
133  * End:
134  * vim: shiftwidth=4 tabstop=8 expandtab
135  */
136