casereader: Implement save, load.
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 13 May 2013 04:34:46 +0000 (21:34 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 16 Feb 2015 19:24:47 +0000 (11:24 -0800)
src/data/case.c
src/data/casereader.c
src/data/casereader.h

index 9d459ac078d4cddc81e22b9132808e2a23965227..d36f66a6ae46385a44ab5a2a9024678a0bf6f674 100644 (file)
@@ -454,8 +454,29 @@ case_save (const struct ccase *c, struct pxd *pxd)
   return pxd_builder_commit (&b);
 }
 
-struct ccase *case_load (struct pxd_object *, const struct pxd *);
+struct ccase *
+case_load (struct pxd_object *object, const struct pxd *pxd)
+{
+  struct caseproto *proto;
+  struct pxd_parser p;
+  struct ccase *c;
+  size_t i;
+
+  pxd_parser_init (&p, object, pxd);
+
+  proto = caseproto_load (pxd_parser_get_link (&p), pxd);
+  c = case_create (proto);
 
+  for (i = 0; i < caseproto_get_n_widths (proto); i++)
+    pxd_parser_get_value (&p, case_data_rw_idx (c, i),
+                          caseproto_get_width (proto, i));
+
+  caseproto_unref (proto);
+
+  pxd_parser_destroy (&p);
+
+  return c;
+}
 
 /* Internal helper function for case_unshare. */
 struct ccase *
index c8050c6cde4c7b2a35d6d2b45aa752c3ecbee1e8..be5509935957adb3c265d90ac496084b2f90b17f 100644 (file)
@@ -325,6 +325,56 @@ casereader_transfer (struct casereader *reader, struct casewriter *writer)
   casereader_destroy (reader);
 }
 
+struct pxd_object *
+casereader_save (const struct casereader *reader_, struct pxd *pxd)
+{
+  struct pxd_array_builder ab;
+  struct casereader *reader;
+  struct pxd_builder b;
+  struct ccase *c;
+
+  pxd_array_builder_init (&ab, pxd);
+  reader = casereader_clone (reader_);
+  while ((c = casereader_read (reader)) != NULL)
+    {
+      pxd_array_builder_add (&ab, case_save (c, pxd));
+      case_unref (c);
+    }
+  casereader_destroy (reader);
+
+  pxd_builder_init (&b, pxd);
+  pxd_builder_put_link (&b, caseproto_save (reader->proto, pxd));
+  pxd_builder_put_link (&b, pxd_array_builder_commit (&ab));
+
+  return pxd_builder_commit (&b);
+}
+
+struct casereader *
+casereader_load (struct pxd_object *object, const struct pxd *pxd)
+{
+  struct casewriter *writer;
+  struct caseproto *proto;
+  struct pxd_array array;
+  struct pxd_parser p;
+  size_t i;
+
+  pxd_parser_init (&p, object, pxd);
+
+  proto = caseproto_load (pxd_parser_get_link (&p), pxd);
+  writer = autopaging_writer_create (proto);
+  caseproto_unref (proto);
+
+  pxd_array_init (&array, pxd_parser_get_link (&p), pxd);
+  for (i = 0; i < pxd_array_size (&array); i++)
+    casewriter_write (writer, case_load (pxd_array_get (&array, i), pxd));
+  pxd_array_destroy (&array);
+
+  pxd_parser_destroy (&p);
+
+  return casewriter_make_reader (writer);
+}
+
+
 /* Creates and returns a new casereader.  This function is
    intended for use by casereader implementations, not by
    casereader clients.
index 45ea2c10afd6fa2eab0ed174a488b1576b5ad464..7565d991f737d1afd38336096e54fb295543c8aa 100644 (file)
@@ -81,6 +81,9 @@ const struct caseproto *casereader_get_proto (const struct casereader *);
 
 casenumber casereader_advance (struct casereader *, casenumber);
 void casereader_transfer (struct casereader *, struct casewriter *);
+
+struct pxd_object *casereader_save (const struct casereader *, struct pxd *);
+struct casereader *casereader_load (struct pxd_object *, const struct pxd *);
 \f
 struct casereader *casereader_create_empty (const struct caseproto *);