ovsdb: Add functions to clone schemas.
authorBen Pfaff <blp@nicira.com>
Wed, 10 Feb 2010 23:37:52 +0000 (15:37 -0800)
committerBen Pfaff <blp@nicira.com>
Mon, 15 Feb 2010 19:31:05 +0000 (11:31 -0800)
These will be used by an upcoming commit.

ovsdb/column.c
ovsdb/column.h
ovsdb/ovsdb.c
ovsdb/ovsdb.h
ovsdb/table.c
ovsdb/table.h

index 0a1f6e4d9fbd612cfc4e0ae1c92d1653d1441f86..58fff1084fd9ae1b8b1bf86ea49a91d86af9f1b7 100644 (file)
@@ -31,6 +31,7 @@ ovsdb_column_create(const char *name, const char *comment,
                     bool mutable, bool persistent,
                     const struct ovsdb_type *type)
 {
+    /* Doesn't set the new column's 'index': the caller must do that. */
     struct ovsdb_column *column;
 
     column = xzalloc(sizeof *column);
@@ -43,6 +44,15 @@ ovsdb_column_create(const char *name, const char *comment,
     return column;
 }
 
+struct ovsdb_column *
+ovsdb_column_clone(const struct ovsdb_column *old)
+{
+    /* Doesn't copy the column's 'index': the caller must do that. */
+    return ovsdb_column_create(old->name, old->comment,
+                               old->mutable, old->persistent,
+                               &old->type);
+}
+
 void
 ovsdb_column_destroy(struct ovsdb_column *column)
 {
index 5fd39ae108f2f22e164f47ec1cbfb2574300128b..eb1a3834ad5198d5c80e377a0aa41a615f39c4c2 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009 Nicira Networks
+/* Copyright (c) 2009, 2010 Nicira Networks
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -47,6 +47,7 @@ enum {
 struct ovsdb_column *ovsdb_column_create(
     const char *name, const char *comment, bool mutable, bool persistent,
     const struct ovsdb_type *);
+struct ovsdb_column *ovsdb_column_clone(const struct ovsdb_column *);
 void ovsdb_column_destroy(struct ovsdb_column *);
 
 struct ovsdb_error *ovsdb_column_from_json(const struct json *,
index 2b5bdc32ec0c96dc97bcd6c855076904f8d1b0a8..b5f6edb12f2751fd8e3169f993cd4ffa5ba1b6f4 100644 (file)
@@ -38,6 +38,22 @@ ovsdb_schema_create(const char *name, const char *comment)
     return schema;
 }
 
+struct ovsdb_schema *
+ovsdb_schema_clone(const struct ovsdb_schema *old)
+{
+    struct ovsdb_schema *new;
+    struct shash_node *node;
+
+    new = ovsdb_schema_create(old->name, old->comment);
+    SHASH_FOR_EACH (node, &old->tables) {
+        const struct ovsdb_table_schema *ts = node->data;
+
+        shash_add(&new->tables, node->name, ovsdb_table_schema_clone(ts));
+    }
+    return new;
+}
+
+
 void
 ovsdb_schema_destroy(struct ovsdb_schema *schema)
 {
index 24ebd9c679aa2944c20b75cf1732c72286fa4e40..9961620acf8e0d4da93a2db9b3297c80b2a385fc 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009 Nicira Networks
+/* Copyright (c) 2009, 2010 Nicira Networks
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -35,6 +35,7 @@ struct ovsdb_schema {
 
 struct ovsdb_schema *ovsdb_schema_create(const char *name,
                                          const char *comment);
+struct ovsdb_schema *ovsdb_schema_clone(const struct ovsdb_schema *);
 void ovsdb_schema_destroy(struct ovsdb_schema *);
 
 struct ovsdb_error *ovsdb_schema_from_file(const char *file_name,
index 1901852452dfc02812baf5eb46177fe806f14823..7ba47eb012a4c8a194b29fb5c89d7c389780fdf0 100644 (file)
@@ -61,6 +61,26 @@ ovsdb_table_schema_create(const char *name, const char *comment, bool mutable)
     return ts;
 }
 
+struct ovsdb_table_schema *
+ovsdb_table_schema_clone(const struct ovsdb_table_schema *old)
+{
+    struct ovsdb_table_schema *new;
+    struct shash_node *node;
+
+    new = ovsdb_table_schema_create(old->name, old->comment, old->mutable);
+    SHASH_FOR_EACH (node, &old->columns) {
+        const struct ovsdb_column *column = node->data;
+
+        if (column->name[0] == '_') {
+            /* Added automatically by ovsdb_table_schema_create(). */
+            continue;
+        }
+
+        add_column(new, ovsdb_column_clone(column));
+    }
+    return new;
+}
+
 void
 ovsdb_table_schema_destroy(struct ovsdb_table_schema *ts)
 {
index 6e8a78596afc2e86074da12c9fed36fd2afc6cde..67784e93c917e45669dcce86167bb8e5dc52bc27 100644 (file)
@@ -35,6 +35,8 @@ struct ovsdb_table_schema {
 struct ovsdb_table_schema *ovsdb_table_schema_create(const char *name,
                                                      const char *comment,
                                                      bool mutable);
+struct ovsdb_table_schema *ovsdb_table_schema_clone(
+    const struct ovsdb_table_schema *);
 void ovsdb_table_schema_destroy(struct ovsdb_table_schema *);
 
 struct ovsdb_error *ovsdb_table_schema_from_json(const struct json *,