schemaJson = ovs.json.from_file(schemaFile)
execfile(annotationFile, globals(), {"s": schemaJson})
ovs.json.to_stream(schemaJson, sys.stdout)
+ sys.stdout.write('\n')
def constify(cType, const):
if (const and cType.endswith('*') and not cType.endswith('**')):
print "\nextern struct ovsdb_idl_column %s_columns[%s_N_COLUMNS];" % (structName, structName.upper())
print '''
+const struct %(s)s *%(s)s_get_for_uuid(const struct ovsdb_idl *, const struct uuid *);
const struct %(s)s *%(s)s_first(const struct ovsdb_idl *);
const struct %(s)s *%(s)s_next(const struct %(s)s *);
#define %(S)s_FOR_EACH(ROW, IDL) \\
print "\nextern struct ovsdb_idl_class %sidl_class;" % prefix
print "\nvoid %sinit(void);" % prefix
+
+ print "\nconst char * %sget_db_version(void);" % prefix
print "\n#endif /* %(prefix)sIDL_HEADER */" % {'prefix': prefix.upper()}
def printEnum(members):
#include <config.h>
#include %s
#include <limits.h>
+#include "ovs-thread.h"
#include "ovsdb-data.h"
#include "ovsdb-error.h"
#include "util.h"
# First, next functions.
print '''
+const struct %(s)s *
+%(s)s_get_for_uuid(const struct ovsdb_idl *idl, const struct uuid *uuid)
+{
+ return %(s)s_cast(ovsdb_idl_get_row_for_uuid(idl, &%(p)stable_classes[%(P)sTABLE_%(T)s], uuid));
+}
+
const struct %(s)s *
%(s)s_first(const struct ovsdb_idl *idl)
{
print "{"
print " struct ovsdb_datum datum;"
if type.n_min == 1 and type.n_max == 1:
+ print " union ovsdb_atom key;"
+ if type.value:
+ print " union ovsdb_atom value;"
print
print " ovs_assert(inited);"
print " datum.n = 1;"
- print " datum.keys = xmalloc(sizeof *datum.keys);"
- print " " + type.key.copyCValue("datum.keys[0].%s" % type.key.type.to_string(), keyVar)
+ print " datum.keys = &key;"
+ print " " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar)
if type.value:
- print " datum.values = xmalloc(sizeof *datum.values);"
- print " "+ type.value.copyCValue("datum.values[0].%s" % type.value.type.to_string(), valueVar)
+ print " datum.values = &value;"
+ print " "+ type.value.assign_c_value_casting_away_const("value.%s" % type.value.type.to_string(), valueVar)
else:
print " datum.values = NULL;"
+ txn_write_func = "ovsdb_idl_txn_write_clone"
elif type.is_optional_pointer():
+ print " union ovsdb_atom key;"
print
print " ovs_assert(inited);"
print " if (%s) {" % keyVar
print " datum.n = 1;"
- print " datum.keys = xmalloc(sizeof *datum.keys);"
- print " " + type.key.copyCValue("datum.keys[0].%s" % type.key.type.to_string(), keyVar)
+ print " datum.keys = &key;"
+ print " " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), keyVar)
print " } else {"
print " datum.n = 0;"
print " datum.keys = NULL;"
print " }"
print " datum.values = NULL;"
+ txn_write_func = "ovsdb_idl_txn_write_clone"
+ elif type.n_max == 1:
+ print " union ovsdb_atom key;"
+ print
+ print " ovs_assert(inited);"
+ print " if (%s) {" % nVar
+ print " datum.n = 1;"
+ print " datum.keys = &key;"
+ print " " + type.key.assign_c_value_casting_away_const("key.%s" % type.key.type.to_string(), "*" + keyVar)
+ print " } else {"
+ print " datum.n = 0;"
+ print " datum.keys = NULL;"
+ print " }"
+ print " datum.values = NULL;"
+ txn_write_func = "ovsdb_idl_txn_write_clone"
else:
print " size_t i;"
print
print " ovs_assert(inited);"
print " datum.n = %s;" % nVar
- print " datum.keys = xmalloc(%s * sizeof *datum.keys);" % nVar
+ print " datum.keys = %s ? xmalloc(%s * sizeof *datum.keys) : NULL;" % (nVar, nVar)
if type.value:
print " datum.values = xmalloc(%s * sizeof *datum.values);" % nVar
else:
valueType = "OVSDB_TYPE_VOID"
print " ovsdb_datum_sort_unique(&datum, %s, %s);" % (
type.key.toAtomicType(), valueType)
- print " ovsdb_idl_txn_write(&row->header_, &%(s)s_columns[%(S)s_COL_%(C)s], &datum);" \
- % {'s': structName,
+ txn_write_func = "ovsdb_idl_txn_write"
+ print " %(f)s(&row->header_, &%(s)s_columns[%(S)s_COL_%(C)s], &datum);" \
+ % {'f': txn_write_func,
+ 's': structName,
'S': structName.upper(),
'C': columnName.upper()}
print "}"
if (inited) {
return;
}
+ assert_single_threaded();
inited = true;
""" % prefix
for tableName, table in sorted(schema.tables.iteritems()):
print " %s_columns_init();" % structName
print "}"
+ print """
+/* Return the schema version. The caller must not free the returned value. */
+const char *
+%sget_db_version(void)
+{
+ return "%s";
+}
+""" % (prefix, schema.version)
+
+
def ovsdb_escape(string):
def escape(match):