[ovs-dev] [PATCH 08/14] ovsdb: Add functions to clone schemas.

Ben Pfaff blp at nicira.com
Fri Feb 12 11:37:28 PST 2010


These will be used by an upcoming commit.
---
 ovsdb/column.c |   10 ++++++++++
 ovsdb/column.h |    3 ++-
 ovsdb/ovsdb.c  |   16 ++++++++++++++++
 ovsdb/ovsdb.h  |    3 ++-
 ovsdb/table.c  |   20 ++++++++++++++++++++
 ovsdb/table.h  |    2 ++
 6 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/ovsdb/column.c b/ovsdb/column.c
index 0a1f6e4..58fff10 100644
--- a/ovsdb/column.c
+++ b/ovsdb/column.c
@@ -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)
 {
diff --git a/ovsdb/column.h b/ovsdb/column.h
index 5fd39ae..eb1a383 100644
--- a/ovsdb/column.h
+++ b/ovsdb/column.h
@@ -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 *,
diff --git a/ovsdb/ovsdb.c b/ovsdb/ovsdb.c
index 2b5bdc3..b5f6edb 100644
--- a/ovsdb/ovsdb.c
+++ b/ovsdb/ovsdb.c
@@ -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)
 {
diff --git a/ovsdb/ovsdb.h b/ovsdb/ovsdb.h
index 24ebd9c..9961620 100644
--- a/ovsdb/ovsdb.h
+++ b/ovsdb/ovsdb.h
@@ -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,
diff --git a/ovsdb/table.c b/ovsdb/table.c
index 1901852..7ba47eb 100644
--- a/ovsdb/table.c
+++ b/ovsdb/table.c
@@ -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)
 {
diff --git a/ovsdb/table.h b/ovsdb/table.h
index 6e8a785..67784e9 100644
--- a/ovsdb/table.h
+++ b/ovsdb/table.h
@@ -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 *,
-- 
1.6.6.1





More information about the dev mailing list