]> git.ipfire.org Git - people/ms/libloc.git/blobdiff - src/writer.c
Write networks to the database
[people/ms/libloc.git] / src / writer.c
index 1e3e360fea5b97c02c660a638a8f667e0454e74a..4c9bcf654fdc7977c281d606b3a222de5e1671b0 100644 (file)
@@ -221,6 +221,38 @@ static int loc_database_write_as_section(struct loc_writer* writer,
        return 0;
 }
 
+static int loc_database_write_network_section(struct loc_network* network, void* data) {
+       FILE* f = (FILE*)data;
+
+       struct loc_database_network_v0 n;
+
+       int r = loc_network_to_database_v0(network, &n);
+       if (r)
+               return r;
+
+       fwrite(&n, 1, sizeof(n), f);
+
+       return 0;
+}
+
+static int loc_database_write_networks_section(struct loc_writer* writer,
+               struct loc_database_header_v0* header, off_t* offset, FILE* f) {
+       DEBUG(writer->ctx, "Networks section starts at %jd bytes\n", *offset);
+       header->networks_offset = htobe32(*offset);
+
+       size_t networks_length = sizeof(struct loc_database_network_v0)
+               * loc_network_tree_count_networks(writer->networks);
+       offset += networks_length;
+
+       int r = loc_network_tree_walk(writer->networks, NULL, loc_database_write_network_section, f);
+       if (r)
+               return r;
+
+       header->networks_length = htobe32(networks_length);
+
+       return 0;
+}
+
 LOC_EXPORT int loc_writer_write(struct loc_writer* writer, FILE* f) {
        struct loc_database_magic magic;
        make_magic(writer, &magic);
@@ -261,6 +293,13 @@ LOC_EXPORT int loc_writer_write(struct loc_writer* writer, FILE* f) {
 
        align_page_boundary(&offset, f);
 
+       // Write all networks
+       r = loc_database_write_networks_section(writer, &header, &offset, f);
+       if (r)
+               return r;
+
+       align_page_boundary(&offset, f);
+
        // Write pool
        r = loc_database_write_pool(writer, &header, &offset, f);
        if (r)