meta-flow: Correctly set destination MAC in mf_set_flow_value().
[sliver-openvswitch.git] / ovsdb / ovsdb-tool.c
index 822eb6b..015ee12 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
+#include "column.h"
 #include "command-line.h"
 #include "compiler.h"
+#include "dynamic-string.h"
 #include "file.h"
 #include "lockfile.h"
 #include "log.h"
 #include "json.h"
 #include "ovsdb.h"
+#include "ovsdb-data.h"
 #include "ovsdb-error.h"
 #include "socket-util.h"
 #include "table.h"
@@ -85,7 +88,7 @@ parse_options(int argc, char *argv[])
             usage();
 
         case 'V':
-            OVS_PRINT_VERSION(0, 0);
+            ovs_print_version(0, 0);
             exit(EXIT_SUCCESS);
 
         case 'v':
@@ -311,7 +314,7 @@ transact(bool read_only, const char *db_file_name, const char *transaction)
     check_ovsdb_error(ovsdb_file_open(db_file_name, read_only, &db, NULL));
 
     request = parse_json(transaction);
-    result = ovsdb_execute(db, request, 0, NULL);
+    result = ovsdb_execute(db, NULL, request, 0, NULL);
     json_destroy(request);
 
     print_and_free_json(result);
@@ -331,12 +334,14 @@ do_transact(int argc OVS_UNUSED, char *argv[])
 }
 
 static void
-print_db_changes(struct shash *tables, struct shash *names)
+print_db_changes(struct shash *tables, struct shash *names,
+                 const struct ovsdb_schema *schema)
 {
     struct shash_node *n1;
 
     SHASH_FOR_EACH (n1, tables) {
         const char *table = n1->name;
+        struct ovsdb_table_schema *table_schema;
         struct json *rows = n1->data;
         struct shash_node *n2;
 
@@ -344,6 +349,7 @@ print_db_changes(struct shash *tables, struct shash *names)
             continue;
         }
 
+        table_schema = shash_find_data(&schema->tables, table);
         SHASH_FOR_EACH (n2, json_object(rows)) {
             const char *row_uuid = n2->name;
             struct json *columns = n2->data;
@@ -366,22 +372,45 @@ print_db_changes(struct shash *tables, struct shash *names)
 
             if (!old_name) {
                 if (new_name) {
-                    printf(" insert row %s:\n", new_name);
+                    printf(" insert row %s (%.8s):\n", new_name, row_uuid);
                 } else {
                     printf(" insert row %.8s:\n", row_uuid);
                 }
             } else {
-                printf(" row %s:\n", old_name);
+                printf(" row %s (%.8s):\n", old_name, row_uuid);
             }
 
             if (columns->type == JSON_OBJECT) {
                 if (show_log_verbosity > 1) {
                     SHASH_FOR_EACH (n3, json_object(columns)) {
                         const char *column = n3->name;
+                        const struct ovsdb_column *column_schema;
                         struct json *value = n3->data;
-                        char *value_string;
-
-                        value_string = json_to_string(value, JSSF_SORT);
+                        char *value_string = NULL;
+
+                        column_schema =
+                            (table_schema
+                             ? shash_find_data(&table_schema->columns, column)
+                             : NULL);
+                        if (column_schema) {
+                            const struct ovsdb_error *error;
+                            const struct ovsdb_type *type;
+                            struct ovsdb_datum datum;
+
+                            type = &column_schema->type;
+                            error = ovsdb_datum_from_json(&datum, type,
+                                                          value, NULL);
+                            if (!error) {
+                                struct ds s;
+
+                                ds_init(&s);
+                                ovsdb_datum_to_string(&datum, type, &s);
+                                value_string = ds_steal_cstr(&s);
+                            }
+                        }
+                        if (!value_string) {
+                            value_string = json_to_string(value, JSSF_SORT);
+                        }
                         printf("\t\t%s=%s\n", column, value_string);
                         free(value_string);
                     }
@@ -420,11 +449,13 @@ do_show_log(int argc OVS_UNUSED, char *argv[])
     const char *db_file_name = argv[1];
     struct shash names;
     struct ovsdb_log *log;
+    struct ovsdb_schema *schema;
     unsigned int i;
 
     check_ovsdb_error(ovsdb_log_open(db_file_name, OVSDB_LOG_READ_ONLY,
                                      -1, &log));
     shash_init(&names);
+    schema = NULL;
     for (i = 0; ; i++) {
         struct json *json;
 
@@ -434,7 +465,11 @@ do_show_log(int argc OVS_UNUSED, char *argv[])
         }
 
         printf("record %u:", i);
-        if (json->type == JSON_OBJECT) {
+        if (i == 0) {
+            check_ovsdb_error(ovsdb_schema_from_json(json, &schema));
+            printf(" \"%s\" schema, version=\"%s\", cksum=\"%s\"\n",
+                   schema->name, schema->version, schema->cksum);
+        } else if (json->type == JSON_OBJECT) {
             struct json *date, *comment;
 
             date = shash_find_data(json_object(json), "_date");
@@ -453,7 +488,7 @@ do_show_log(int argc OVS_UNUSED, char *argv[])
 
             if (i > 0 && show_log_verbosity > 0) {
                 putchar('\n');
-                print_db_changes(json_object(json), &names);
+                print_db_changes(json_object(json), &names, schema);
             }
         }
         json_destroy(json);
@@ -461,6 +496,7 @@ do_show_log(int argc OVS_UNUSED, char *argv[])
     }
 
     ovsdb_log_close(log);
+    ovsdb_schema_destroy(schema);
     /* XXX free 'names'. */
 }