Updated source file headers with new year and no CVS Id.
[pazpar2-moved-to-github.git] / src / record.c
index 2d83012..9864238 100644 (file)
@@ -1,7 +1,5 @@
-/* $Id: record.c,v 1.2 2007-04-23 08:48:50 marc Exp $
-   Copyright (c) 2006-2007, Index Data.
-
-This file is part of Pazpar2.
+/* This file is part of Pazpar2.
+   Copyright (C) 2006-2008 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
@@ -14,12 +12,12 @@ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
-along with Pazpar2; see the file LICENSE.  If not, write to the
-Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.
- */
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
-/* $Id: record.c,v 1.2 2007-04-23 08:48:50 marc Exp $ */
+*/
+
+/* $Id: record.c,v 1.10 2007-06-13 21:29:04 adam Exp $ */
 
 
 #include <string.h>
@@ -36,34 +34,66 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "record.h"
 
 
-struct record * record_create(NMEM nmem, int num_metadata, int num_sortkeys)
+
+union data_types * data_types_assign(NMEM nmem, 
+                                     union data_types ** data1, 
+                                     union data_types data2)
+{
+    // assert(nmem);
+
+    if (!data1)
+        return 0;
+
+    if (!*data1){
+        if (!nmem)
+            return 0;
+        else
+            *data1  = nmem_malloc(nmem, sizeof(union data_types));
+    }
+    
+    **data1 = data2;
+    return *data1;
+}
+
+
+struct record * record_create(NMEM nmem, int num_metadata, int num_sortkeys,
+                              struct client *client, int position)
 {
     struct record * record = 0;
+    int i = 0;
     
     // assert(nmem);
 
     record = nmem_malloc(nmem, sizeof(struct record));
 
     record->next = 0;
-    // which client should I use for record->client = cl;  ??
-    record->client = 0;
+    record->client = client;
 
     record->metadata 
         = nmem_malloc(nmem, 
                       sizeof(struct record_metadata*) * num_metadata);
-    memset(record->metadata, 0, 
-           sizeof(struct record_metadata*) * num_metadata);
+    for (i = 0; i < num_metadata; i++)
+        record->metadata[i] = 0;
     
     record->sortkeys  
         = nmem_malloc(nmem, 
                       sizeof(union data_types*) * num_sortkeys);
-    memset(record->metadata, 0, 
-           sizeof(union data_types*) * num_sortkeys);
-    
+    for (i = 0; i < num_sortkeys; i++)
+        record->sortkeys[i] = 0;
+
+    record->position = position;
     
     return record;
 }
 
+struct record_metadata * record_metadata_create(NMEM nmem)
+{
+    struct record_metadata * rec_md 
+        = nmem_malloc(nmem, sizeof(struct record_metadata));
+    rec_md->next = 0;
+    return rec_md;
+}
+
 
 struct record_metadata * record_metadata_insert(NMEM nmem, 
                                                 struct record_metadata ** rmd,
@@ -80,11 +110,22 @@ struct record_metadata * record_metadata_insert(NMEM nmem,
     tmp_rmd->data = data;
 
 
-    // insert in *rmd's place
+    // insert in *rmd's place, moving *rmd one down the list
     tmp_rmd->next = *rmd;
     *rmd = tmp_rmd;
 
-    return 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);
 }
 
 
@@ -99,7 +140,7 @@ struct record_metadata * record_add_metadata(NMEM nmem,
     if (!record || !record->metadata || !service || !name)  
         return 0;
     
-    field_id = conf_service_field_id(service, name);
+    field_id = conf_service_metadata_field_id(service, name);
 
     if (-1 == field_id)
         return 0;
@@ -109,16 +150,41 @@ struct record_metadata * record_add_metadata(NMEM nmem,
 
 
 
-struct record_metadata * record_add_metadata_field_id(NMEM nmem, 
-                                                     struct record * record,
-                                                     int field_id, 
-                                                     union data_types 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->metadata)
+    if (field_id < 0 || !record || !record->sortkeys)
         return 0;
 
-    return record_metadata_insert(nmem, &(record->metadata[field_id]), data);
-};
+    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);
+}
+
 
 
 /*