+ return %(s)s_cast(ovsdb_idl_next_row(&row->header_));
+}''' % {'s': structName,
+ 'p': prefix,
+ 'P': prefix.upper(),
+ 'T': tableName.upper()}
+
+ print '''
+void
+%(s)s_delete(const struct %(s)s *row_)
+{
+ struct %(s)s *row = (struct %(s)s *) row_;
+ ovsdb_idl_txn_delete(&row->header_);
+}
+
+struct %(s)s *
+%(s)s_insert(struct ovsdb_idl_txn *txn)
+{
+ return %(s)s_cast(ovsdb_idl_txn_insert(txn, &%(p)stable_classes[%(P)sTABLE_%(T)s]));
+}
+''' % {'s': structName,
+ 'p': prefix,
+ 'P': prefix.upper(),
+ 'T': tableName.upper()}
+
+ # Verify functions.
+ for columnName, column in table.columns.iteritems():
+ print '''
+void
+%(s)s_verify_%(c)s(const struct %(s)s *row)
+{
+ ovsdb_idl_txn_verify(&row->header_, &%(s)s_columns[%(S)s_COL_%(C)s]);
+}''' % {'s': structName,
+ 'S': structName.upper(),
+ 'c': columnName,
+ 'C': columnName.upper()}
+
+ # Set functions.
+ for columnName, column in table.columns.iteritems():
+ type = column.type
+ print '\nvoid'
+ members = cMembers(prefix, columnName, column, True)
+ keyVar = members[0]['name']
+ nVar = None
+ valueVar = None
+ if type.value:
+ valueVar = members[1]['name']
+ if len(members) > 2:
+ nVar = members[2]['name']
+ else:
+ if len(members) > 1:
+ nVar = members[1]['name']
+ 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])}
+ print "{"
+ print " struct %(s)s *row = (struct %(s)s *) row_;" % {'s': structName}
+ print " struct ovsdb_datum datum;"
+ if type.min == 1 and type.max == 1:
+ print
+ print " datum.n = 1;"
+ print " datum.keys = xmalloc(sizeof *datum.keys);"
+ print cCopyType(" ", "row->%s" % keyVar, "datum.keys[0].%s" % type.key, keyVar, type.key, type.keyRefTable)
+ if type.value:
+ print " datum.values = xmalloc(sizeof *datum.values);"
+ print cCopyType(" ", "row->%s" % valueVar, "datum.values[0].%s" % type.value, valueVar, type.value, type.valueRefTable)
+ else:
+ print " datum.values = NULL;"
+ elif typeIsOptionalPointer(type):
+ print
+ print " if (%s) {" % keyVar
+ print " datum.n = 1;"
+ print " datum.keys = xmalloc(sizeof *datum.keys);"
+ print cCopyType(" ", "row->%s" % keyVar, "datum.keys[0].%s" % type.key, keyVar, type.key, type.keyRefTable)
+ print " } else {"
+ print " datum.n = 0;"
+ print " datum.keys = NULL;"
+ print " row->%s = NULL;" % keyVar
+ print " }"
+ print " datum.values = NULL;"
+ else:
+ print " size_t i;"
+ print
+ print " free(row->%s);" % keyVar
+ print " row->%s = %s ? xmalloc(%s * sizeof *row->%s) : NULL;" % (keyVar, nVar, nVar, keyVar)
+ print " row->%s = %s;" % (nVar, nVar)
+ if type.value:
+ print " free(row->%s);" % valueVar
+ print " row->%s = xmalloc(%s * sizeof *row->%s);" % (valueVar, nVar, valueVar)
+ print " datum.n = %s;" % nVar
+ print " datum.keys = xmalloc(%s * sizeof *datum.keys);" % nVar
+ if type.value:
+ print " datum.values = xmalloc(%s * sizeof *datum.values);" % nVar
+ else:
+ print " datum.values = NULL;"
+ print " for (i = 0; i < %s; i++) {" % nVar
+ print cCopyType(" ", "row->%s[i]" % keyVar, "datum.keys[i].%s" % type.key, "%s[i]" % keyVar, type.key, type.keyRefTable)
+ if type.value:
+ print cCopyType(" ", "row->%s[i]" % valueVar, "datum.values[i].%s" % type.value, "%s[i]" % valueVar, type.value, type.valueRefTable)
+ print " }"
+ print " ovsdb_idl_txn_write(&row->header_, &%(s)s_columns[%(S)s_COL_%(C)s], &datum);" \
+ % {'s': structName,
+ 'S': structName.upper(),
+ 'C': columnName.upper()}
+ print "}"