---
ovsdb/ovsdb-tool.1.in | 7 +++++++
ovsdb/ovsdb-tool.c | 15 +++++++++++++++
ovsdb/ovsdb.c | 17 +++++++++++++++++
ovsdb/ovsdb.h | 3 +++
tests/ovsdb-tool.at | 22 ++++++++++++++++++++++
5 files changed, 64 insertions(+), 0 deletions(-)
diff --git a/ovsdb/ovsdb-tool.1.in b/ovsdb/ovsdb-tool.1.in
index 79bd2a6..7f34609 100644
--- a/ovsdb/ovsdb-tool.1.in
+++ b/ovsdb/ovsdb-tool.1.in
@@ -19,6 +19,8 @@ ovsdb\-tool \- Open vSwitch database management utility
\fBovsdb\-tool \fR[\fIoptions\fR] \fBconvert\fI db schema
\fR[\fItarget\fR]
.br
+\fBovsdb\-tool \fR[\fIoptions\fR] \fBneeds\-conversion\fI db schema\fR
+.br
\fBovsdb\-tool \fR[\fIoptions\fR] \fBdb\-version\fI db\fR
.br
\fBovsdb\-tool \fR[\fIoptions\fR] \fBschema\-version\fI schema\fR
@@ -76,6 +78,11 @@ ignored. Columns that exist in \fIschema\fR but not in
\fIdb\fR are
set to their default values. All of \fIschema\fR's constraints apply
in full.
.
+.IP "\fBneeds\-conversion\fI db schema\fR"
+Reads the schema embedded in \fIdb\fR and the standalone schema in
+\fIschema\fR and compares them. If the schemas are the same, prints
+\fBno\fR on stdout; if they differ, print \fByes\fR.
+.
.IP "\fBdb\-version\fI db\fR"
.IQ "\fBschema\-version\fI schema\fR"
Prints the version number in the schema embedded within the database
diff --git a/ovsdb/ovsdb-tool.c b/ovsdb/ovsdb-tool.c
index 3730e67..4f55b6a 100644
--- a/ovsdb/ovsdb-tool.c
+++ b/ovsdb/ovsdb-tool.c
@@ -244,6 +244,20 @@ do_convert(int argc OVS_UNUSED, char *argv[])
}
static void
+do_needs_conversion(int argc OVS_UNUSED, char *argv[])
+{
+ const char *db_file_name = argv[1];
+ const char *schema_file_name = argv[2];
+ struct ovsdb_schema *schema1, *schema2;
+
+ check_ovsdb_error(ovsdb_file_read_schema(db_file_name, &schema1));
+ check_ovsdb_error(ovsdb_schema_from_file(schema_file_name, &schema2));
+ puts(ovsdb_schema_equal(schema1, schema2) ? "no" : "yes");
+ ovsdb_schema_destroy(schema1);
+ ovsdb_schema_destroy(schema2);
+}
+
+static void
do_db_version(int argc OVS_UNUSED, char *argv[])
{
const char *db_file_name = argv[1];
@@ -458,6 +472,7 @@ static const struct command all_commands[] = {
{ "create", 2, 2, do_create },
{ "compact", 1, 2, do_compact },
{ "convert", 2, 3, do_convert },
+ { "needs-conversion", 2, 2, do_needs_conversion },
{ "db-version", 1, 1, do_db_version },
{ "db-cksum", 1, 1, do_db_cksum },
{ "schema-version", 1, 1, do_schema_version },
diff --git a/ovsdb/ovsdb.c b/ovsdb/ovsdb.c
index 46d06a0..2a54a7b 100644
--- a/ovsdb/ovsdb.c
+++ b/ovsdb/ovsdb.c
@@ -235,6 +235,23 @@ ovsdb_schema_to_json(const struct ovsdb_schema *schema)
return json;
}
+
+/* Returns true if 'a' and 'b' specify equivalent schemas, false if they
+ * differ. */
+bool
+ovsdb_schema_equal(const struct ovsdb_schema *a,
+ const struct ovsdb_schema *b)
+{
+ /* This implementation is simple, stupid, and slow, but I doubt that it
+ * will ever require much maintenance. */
+ struct json *ja = ovsdb_schema_to_json(a);
+ struct json *jb = ovsdb_schema_to_json(b);
+ bool equals = json_equal(ja, jb);
+ json_destroy(ja);
+ json_destroy(jb);
+
+ return equals;
+}
static void
ovsdb_set_ref_table(const struct shash *tables,
diff --git a/ovsdb/ovsdb.h b/ovsdb/ovsdb.h
index ae743bb..834ff1a 100644
--- a/ovsdb/ovsdb.h
+++ b/ovsdb/ovsdb.h
@@ -47,6 +47,9 @@ struct ovsdb_error *ovsdb_schema_from_json(struct json *,
struct ovsdb_schema **)
WARN_UNUSED_RESULT;
struct json *ovsdb_schema_to_json(const struct ovsdb_schema *);
+
+bool ovsdb_schema_equal(const struct ovsdb_schema *,
+ const struct ovsdb_schema *);
/* Database. */
struct ovsdb {
diff --git a/tests/ovsdb-tool.at b/tests/ovsdb-tool.at
index 0f11668..989159d 100644
--- a/tests/ovsdb-tool.at
+++ b/tests/ovsdb-tool.at
@@ -306,3 +306,25 @@ AT_CHECK([ovsdb-tool create db schema], [0], [], [ignore])
AT_CHECK([ovsdb-tool db-cksum db], [0], [12345678 9
])
AT_CLEANUP
+
+AT_SETUP([ovsdb-tool needs-conversion (no conversion needed)])
+AT_KEYWORDS([ovsdb file positive])
+AT_DATA([schema], [ORDINAL_SCHEMA
+])
+touch .db.~lock~
+AT_CHECK([ovsdb-tool create db schema], [0], [], [ignore])
+AT_CHECK([ovsdb-tool needs-conversion db schema], [0], [no
+])
+AT_CLEANUP
+
+AT_SETUP([ovsdb-tool needs-conversion (conversion needed)])
+AT_KEYWORDS([ovsdb file positive])
+AT_DATA([schema], [ORDINAL_SCHEMA
+])
+touch .db.~lock~
+AT_CHECK([ovsdb-tool create db schema], [0], [], [ignore])
+sed 's/5\.1\.3/5.1.4/' < schema > schema2
+AT_CHECK([diff schema schema2], [1], [ignore])
+AT_CHECK([ovsdb-tool needs-conversion db schema2], [0], [yes
+])
+AT_CLEANUP
--
1.7.1
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev_openvswitch.org