From e1ebc8cea2991e19456cb9fce54ac8167f6dbf4c Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 8 Feb 2011 15:36:21 -0800 Subject: [PATCH] ovsdb: New function ovsdb_file_read_schema() for reading schema from db. 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 | 86 +++++++++++++++++++++++++++++++++++----------- ovsdb/file.h | 6 +++- ovsdb/ovsdb-tool.c | 10 +++--- 3 files changed, 76 insertions(+), 26 deletions(-) diff --git a/ovsdb/file.c b/ovsdb/file.c index d09395c4..a02b6510 100644 --- a/ovsdb/file.c +++ b/ovsdb/file.c @@ -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); +} /* Replica implementation. */ diff --git a/ovsdb/file.h b/ovsdb/file.h index b28c3181..19d51c01 100644 --- a/ovsdb/file.h +++ b/ovsdb/file.h @@ -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 */ diff --git a/ovsdb/ovsdb-tool.c b/ovsdb/ovsdb-tool.c index 130e7377..2e134ce6 100644 --- a/ovsdb/ovsdb-tool.c +++ b/ovsdb/ovsdb-tool.c @@ -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 -- 2.30.2