diff options
author | Ethan Jackson <ethan@nicira.com> | 2012-03-20 17:41:54 -0700 |
---|---|---|
committer | Ethan Jackson <ethan@nicira.com> | 2012-03-22 16:27:04 -0700 |
commit | f67f13545ebe61e02dc3aee98b60dc362f96946c (patch) | |
tree | 20bdedca5bae1b4a7da8d02d0ee544fa1d80a34a /ovsdb | |
parent | 0104aba86e4de01790ee0f1ffb96a1193fa3e04d (diff) |
idl: New helpers for accessing string maps.
This removes some boilerplate from the bridge.
Signed-off-by: Ethan Jackson <ethan@nicira.com>
Diffstat (limited to 'ovsdb')
-rwxr-xr-x | ovsdb/ovsdb-idlc.in | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in index 089bc23d..0ee5c6b1 100755 --- a/ovsdb/ovsdb-idlc.in +++ b/ovsdb/ovsdb-idlc.in @@ -25,6 +25,12 @@ def constify(cType, const): else: return cType +def is_string_map(column): + return (column.type.key + and column.type.value + and column.type.key.type == ovs.db.types.StringType + and column.type.value.type == ovs.db.types.StringType) + def cMembers(prefix, columnName, column, const): type = column.type if type.n_min == 1 and type.n_max == 1: @@ -140,6 +146,15 @@ struct %(s)s *%(s)s_insert(struct ovsdb_idl_txn *); in cMembers(prefix, columnName, column, True)] print '%s);' % ', '.join(args) + print + for columnName, column in sorted(table.columns.iteritems()): + if not is_string_map(column): + continue + print "const char *%(s)s_get_%(c)s_value(const struct %(s)s *," \ + " const char *key, const char *default_value);" \ + % {'s': structName, 'c': columnName} + + # Table indexes. printEnum(["%sTABLE_%s" % (prefix.upper(), tableName.upper()) for tableName in sorted(schema.tables)] + ["%sN_TABLES" % prefix.upper()]) print @@ -188,6 +203,22 @@ enum { sizeof_bool = sizeof(bool) }; static bool inited; ''' % schema.idlHeader + try: + for table in schema.tables.itervalues(): + for column in table.columns.itervalues(): + if is_string_map(column): + print """\ +static int +bsearch_strcmp(const void *a_, const void *b_) +{ + char *const *a = a_; + char *const *b = b_; + return strcmp(*a, *b); +}""" + raise StopIteration + except StopIteration: + pass + # Cast functions. for tableName, table in sorted(schema.tables.iteritems()): structName = "%s%s" % (prefix, tableName.lower()) @@ -492,6 +523,25 @@ const struct ovsdb_datum * 'C': columnName.upper()} print "}" + # String Map Helpers. + for columnName, column in sorted(table.columns.iteritems()): + if not is_string_map(column): + continue + + print """ +const char * %(s)s_get_%(c)s_value(const struct %(s)s *row, const char *search_key, const char *default_value) +{ + char **keys = row->key_%(c)s; + char **values = row->value_%(c)s; + size_t n_keys = row->n_%(c)s; + char ** result_key; + + assert(inited); + result_key = bsearch(&search_key, keys, n_keys, sizeof *keys, + bsearch_strcmp); + return result_key ? values[result_key - keys] : default_value; +}""" % {'s': structName, 'c': columnName} + # Table columns. print "\nstruct ovsdb_idl_column %s_columns[%s_N_COLUMNS];" % ( structName, structName.upper()) |