else:
return cType
-def cMembers(prefix, columnName, column, const):
+def cMembers(prefix, tableName, columnName, column, const):
+ comment = ""
type = column.type
if type.is_smap():
- return [{'name': columnName,
- 'type': 'struct smap ',
- 'comment': ''}]
+ comment = """
+/* Sets the "%(c)s" column's value from the "%(t)s" table in 'row'
+ * to '%(c)s'.
+ *
+ * The caller retains ownership of '%(c)s' and everything in it. */""" \
+ % {'c': columnName,
+ 't': tableName}
+ return (comment, [{'name': columnName,
+ 'type': 'struct smap ',
+ 'comment': ''}])
+
+ comment = """\n/* Sets the "%s" column from the "%s" table in """\
+ """'row' to\n""" % (columnName, tableName)
if type.n_min == 1 and type.n_max == 1:
singleton = True
else:
pointer = '*'
+
if type.value:
- key = {'name': "key_%s" % columnName,
+ keyName = "key_%s" % columnName
+ valueName = "value_%s" % columnName
+
+ key = {'name': keyName,
'type': constify(type.key.toCType(prefix) + pointer, const),
'comment': ''}
- value = {'name': "value_%s" % columnName,
+ value = {'name': valueName,
'type': constify(type.value.toCType(prefix) + pointer, const),
'comment': ''}
+
+ if singleton:
+ comment += " * the map with key '%s' and value '%s'\n *" \
+ % (keyName, valueName)
+ else:
+ comment += " * the map with keys '%s' and values '%s'\n *" \
+ % (keyName, valueName)
members = [key, value]
else:
m = {'name': columnName,
'type': constify(type.key.toCType(prefix) + pointer, const),
'comment': type.cDeclComment()}
+
+ if singleton:
+ comment += " * '%s'" % columnName
+ else:
+ comment += " * the '%s' set" % columnName
members = [m]
if not singleton and not type.is_optional_pointer():
- members.append({'name': 'n_%s' % columnName,
+ sizeName = "n_%s" % columnName
+
+ comment += " with '%s' entries" % sizeName
+ members.append({'name': sizeName,
'type': 'size_t ',
'comment': ''})
- return members
+
+ comment += ".\n"
+
+ if type.is_optional() and not type.is_optional_pointer():
+ comment += """ *
+ * '%s' may be 0 or 1; if it is 0, then '%s'
+ * may be NULL.\n""" \
+ % ("n_%s" % columnName, columnName)
+
+ if type.is_optional_pointer():
+ comment += """ *
+ * If "%s" is null, the column will be the empty set,
+ * otherwise it will contain the specified value.\n""" % columnName
+
+ if type.constraintsToEnglish():
+ comment += """ *
+ * Argument constraints: %s\n""" \
+ % type.constraintsToEnglish(lambda s : '"%s"' % s)
+
+ comment += " *\n * The caller retains ownership of the arguments. */"
+
+ return (comment, members)
def printCIDLHeader(schemaFile):
schema = parseSchema(schemaFile)
print "\tstruct ovsdb_idl_row header_;"
for columnName, column in sorted(table.columns.iteritems()):
print "\n\t/* %s column. */" % columnName
- for member in cMembers(prefix, columnName, column, False):
+ comment, members = cMembers(prefix, tableName,
+ columnName, column, False)
+ for member in members:
print "\t%(type)s%(name)s;%(comment)s" % member
print "};"
# Column indexes.
- printEnum(["%s_COL_%s" % (structName.upper(), columnName.upper())
+ printEnum("%s_column_id" % structName.lower(), ["%s_COL_%s" % (structName.upper(), columnName.upper())
for columnName in sorted(table.columns)]
+ ["%s_N_COLUMNS" % structName.upper()])
(ROW) ? ((NEXT) = %(s)s_next(ROW), 1) : 0; \\
(ROW) = (NEXT))
+unsigned int %(s)s_get_seqno(const struct ovsdb_idl *);
+unsigned int %(s)s_row_get_seqno(const struct %(s)s *row, enum ovsdb_idl_change change);
+const struct %(s)s *%(s)s_track_get_first(const struct ovsdb_idl *);
+const struct %(s)s *%(s)s_track_get_next(const struct %(s)s *);
+#define %(S)s_FOR_EACH_TRACKED(ROW, IDL) \\
+ for ((ROW) = %(s)s_track_get_first(IDL); \\
+ (ROW); \\
+ (ROW) = %(s)s_track_get_next(ROW))
+
void %(s)s_init(struct %(s)s *);
void %(s)s_delete(const struct %(s)s *);
struct %(s)s *%(s)s_insert(struct ovsdb_idl_txn *);
+bool %(s)s_is_updated(const struct %(s)s *, enum %(s)s_column_id);
''' % {'s': structName, 'S': structName.upper()}
for columnName, column in sorted(table.columns.iteritems()):
print 'void %(s)s_verify_%(c)s(const struct %(s)s *);' % {'s': structName, 'c': columnName}
- print """
-/* Functions for fetching columns as \"struct ovsdb_datum\"s. (This is
- rarely useful. More often, it is easier to access columns by using
- the members of %(s)s directly.) */""" % {'s': structName}
+ print
for columnName, column in sorted(table.columns.iteritems()):
if column.type.value:
valueParam = ', enum ovsdb_atomic_type value_type'
if column.type.is_smap():
args = ['const struct smap *']
else:
- args = ['%(type)s%(name)s' % member for member
- in cMembers(prefix, columnName, column, True)]
+ comment, members = cMembers(prefix, tableName, columnName,
+ column, True)
+ args = ['%(type)s%(name)s' % member for member in members]
print '%s);' % ', '.join(args)
print
# Table indexes.
- printEnum(["%sTABLE_%s" % (prefix.upper(), tableName.upper()) for tableName in sorted(schema.tables)] + ["%sN_TABLES" % prefix.upper()])
+ printEnum("%stable_id" % prefix.lower(), ["%sTABLE_%s" % (prefix.upper(), tableName.upper()) for tableName in sorted(schema.tables)] + ["%sN_TABLES" % prefix.upper()])
print
for tableName in schema.tables:
print "#define %(p)stable_%(t)s (%(p)stable_classes[%(P)sTABLE_%(T)s])" % {
print "\nconst char * %sget_db_version(void);" % prefix
print "\n#endif /* %(prefix)sIDL_HEADER */" % {'prefix': prefix.upper()}
-def printEnum(members):
+def printEnum(type, members):
if len(members) == 0:
return
- print "\nenum {";
+ print "\nenum %s {" % type
for member in members[:-1]:
print " %s," % member
print " %s" % members[-1]
%(s)s_next(const struct %(s)s *row)
{
return %(s)s_cast(ovsdb_idl_next_row(&row->header_));
+}
+
+unsigned int %(s)s_get_seqno(const struct ovsdb_idl *idl)
+{
+ return ovsdb_idl_table_get_seqno(idl, &%(p)stable_classes[%(P)sTABLE_%(T)s]);
+}
+
+unsigned int %(s)s_row_get_seqno(const struct %(s)s *row, enum ovsdb_idl_change change)
+{
+ return ovsdb_idl_row_get_seqno(&row->header_, change);
+}
+
+const struct %(s)s *
+%(s)s_track_get_first(const struct ovsdb_idl *idl)
+{
+ return %(s)s_cast(ovsdb_idl_track_get_first(idl, &%(p)stable_classes[%(P)sTABLE_%(T)s]));
+}
+
+const struct %(s)s
+*%(s)s_track_get_next(const struct %(s)s *row)
+{
+ return %(s)s_cast(ovsdb_idl_track_get_next(&row->header_));
}''' % {'s': structName,
'p': prefix,
'P': prefix.upper(),
'T': tableName.upper()}
print '''
+
/* Deletes 'row' from table "%(t)s". 'row' may be freed, so it must not be
* accessed afterward.
*
%(s)s_insert(struct ovsdb_idl_txn *txn)
{
return %(s)s_cast(ovsdb_idl_txn_insert(txn, &%(p)stable_classes[%(P)sTABLE_%(T)s], NULL));
+}
+
+bool
+%(s)s_is_updated(const struct %(s)s *row, enum %(s)s_column_id column)
+{
+ return ovsdb_idl_track_is_updated(&row->header_, &%(s)s_columns[column]);
}''' % {'s': structName,
'p': prefix,
'P': prefix.upper(),
for columnName, column in sorted(table.columns.iteritems()):
type = column.type
+ comment, members = cMembers(prefix, tableName, columnName,
+ column, True)
+
if type.is_smap():
- print """
-void
+ print comment
+ print """void
%(s)s_set_%(c)s(const struct %(s)s *row, const struct smap *%(c)s)
{
struct ovsdb_datum datum;
&%(s)s_columns[%(S)s_COL_%(C)s],
&datum);
}
-""" % {'s': structName,
+""" % {'t': tableName,
+ 's': structName,
'S': structName.upper(),
'c': columnName,
'C': columnName.upper()}
continue
-
- print '\nvoid'
- members = cMembers(prefix, columnName, column, True)
keyVar = members[0]['name']
nVar = None
valueVar = None
else:
if len(members) > 1:
nVar = members[1]['name']
+
+ print comment
+ print 'void'
print '%(s)s_set_%(c)s(const struct %(s)s *row, %(args)s)' % \
{'s': structName, 'c': columnName,
'args': ', '.join(['%(type)s%(name)s' % m for m in members])}