ovsdb: New function ovsdb_file_read_schema() for reading schema from db.
authorBen Pfaff <blp@nicira.com>
Tue, 8 Feb 2011 23:36:21 +0000 (15:36 -0800)
committerBen Pfaff <blp@nicira.com>
Tue, 15 Feb 2011 20:24:28 +0000 (12:24 -0800)
This new function saves reading the whole database when only the schema is
of interest.  This commit adapts ovsdb-tool to use it for the "db-version"
command.  Upcoming commits will introduce another caller.

ovsdb/file.c
ovsdb/file.h
ovsdb/ovsdb-tool.c

index d09395c..a02b651 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2010 Nicira Networks
+/* Copyright (c) 2009, 2010, 2011 Nicira Networks
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -121,24 +121,16 @@ ovsdb_file_open_as_schema(const char *file_name,
 }
 
 static struct ovsdb_error *
-ovsdb_file_open__(const char *file_name,
-                  const struct ovsdb_schema *alternate_schema,
-                  bool read_only, struct ovsdb **dbp,
-                  struct ovsdb_file **filep)
+ovsdb_file_open_log(const char *file_name, enum ovsdb_log_open_mode open_mode,
+                    struct ovsdb_log **logp, struct ovsdb_schema **schemap)
 {
-    enum ovsdb_log_open_mode open_mode;
-    long long int oldest_commit;
-    unsigned int n_transactions;
     struct ovsdb_schema *schema = NULL;
-    struct ovsdb_error *error;
     struct ovsdb_log *log = NULL;
-    struct json *json;
-    struct ovsdb *db = NULL;
+    struct ovsdb_error *error;
+    struct json *json = NULL;
 
-    /* In read-only mode there is no ovsdb_file so 'filep' must be null. */
-    assert(!(read_only && filep));
+    assert(logp || schemap);
 
-    open_mode = read_only ? OVSDB_LOG_READ_ONLY : OVSDB_LOG_READ_WRITE;
     error = ovsdb_log_open(file_name, open_mode, -1, &log);
     if (error) {
         goto error;
@@ -153,9 +145,7 @@ ovsdb_file_open__(const char *file_name,
         goto error;
     }
 
-    if (alternate_schema) {
-        schema = ovsdb_schema_clone(alternate_schema);
-    } else {
+    if (schemap) {
         error = ovsdb_schema_from_json(json, &schema);
         if (error) {
             json_destroy(json);
@@ -167,8 +157,54 @@ ovsdb_file_open__(const char *file_name,
     }
     json_destroy(json);
 
-    db = ovsdb_create(schema);
-    schema = NULL;
+    if (logp) {
+        *logp = log;
+    } else {
+        ovsdb_log_close(log);
+    }
+    if (schemap) {
+        *schemap = schema;
+    }
+    return NULL;
+
+error:
+    ovsdb_log_close(log);
+    json_destroy(json);
+    if (logp) {
+        *logp = NULL;
+    }
+    if (schemap) {
+        *schemap = NULL;
+    }
+    return error;
+}
+
+static struct ovsdb_error *
+ovsdb_file_open__(const char *file_name,
+                  const struct ovsdb_schema *alternate_schema,
+                  bool read_only, struct ovsdb **dbp,
+                  struct ovsdb_file **filep)
+{
+    enum ovsdb_log_open_mode open_mode;
+    long long int oldest_commit;
+    unsigned int n_transactions;
+    struct ovsdb_schema *schema = NULL;
+    struct ovsdb_error *error;
+    struct ovsdb_log *log;
+    struct json *json;
+    struct ovsdb *db = NULL;
+
+    /* In read-only mode there is no ovsdb_file so 'filep' must be null. */
+    assert(!(read_only && filep));
+
+    open_mode = read_only ? OVSDB_LOG_READ_ONLY : OVSDB_LOG_READ_WRITE;
+    error = ovsdb_file_open_log(file_name, open_mode, &log,
+                                alternate_schema ? NULL : &schema);
+    if (error) {
+        goto error;
+    }
+
+    db = ovsdb_create(schema ? schema : ovsdb_schema_clone(alternate_schema));
 
     oldest_commit = LLONG_MAX;
     n_transactions = 0;
@@ -225,7 +261,6 @@ error:
         *filep = NULL;
     }
     ovsdb_destroy(db);
-    ovsdb_schema_destroy(schema);
     ovsdb_log_close(log);
     return error;
 }
@@ -460,6 +495,17 @@ ovsdb_file_save_copy(const char *file_name, int locking,
 {
     return ovsdb_file_save_copy__(file_name, locking, comment, db, NULL);
 }
+
+/* Opens database 'file_name', reads its schema, and closes it.  On success,
+ * stores the schema into '*schemap' and returns NULL; the caller then owns the
+ * schema.  On failure, returns an ovsdb_error (which the caller must destroy)
+ * and sets '*dbp' to NULL. */
+struct ovsdb_error *
+ovsdb_file_read_schema(const char *file_name, struct ovsdb_schema **schemap)
+{
+    assert(schemap != NULL);
+    return ovsdb_file_open_log(file_name, OVSDB_LOG_READ_ONLY, NULL, schemap);
+}
 \f
 /* Replica implementation. */
 
index b28c318..19d51c0 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2010 Nicira Networks
+/* Copyright (c) 2009, 2010, 2011 Nicira Networks
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -40,4 +40,8 @@ struct ovsdb_error *ovsdb_file_save_copy(const char *file_name, int locking,
 
 struct ovsdb_error *ovsdb_file_compact(struct ovsdb_file *);
 
+struct ovsdb_error *ovsdb_file_read_schema(const char *file_name,
+                                           struct ovsdb_schema **)
+    WARN_UNUSED_RESULT;
+
 #endif /* ovsdb/file.h */
index 130e737..2e134ce 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2010 Nicira Networks.
+ * Copyright (c) 2009, 2010, 2011 Nicira Networks.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -245,11 +245,11 @@ static void
 do_db_version(int argc OVS_UNUSED, char *argv[])
 {
     const char *db_file_name = argv[1];
-    struct ovsdb *db;
+    struct ovsdb_schema *schema;
 
-    check_ovsdb_error(ovsdb_file_open(db_file_name, true, &db, NULL));
-    puts(db->schema->version);
-    ovsdb_destroy(db);
+    check_ovsdb_error(ovsdb_file_read_schema(db_file_name, &schema));
+    puts(schema->version);
+    ovsdb_schema_destroy(schema);
 }
 
 static void