From 8d549f29ee743cff2deaab5112dde797476f441f Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Wed, 19 Apr 2017 14:43:08 +0200 Subject: [PATCH] Initialize column name hash *after* table version is known. We use hash_function() to determine the path of the file/directory which corresponds to columns of type MAPPED_STORAGE or DISK_STORAGE. Currently this happens before the index has been mapped, so we don't know the table version at this point. Future versions of osl will support multiple hash functions, and the hash function to use will be determined from the table version. At this point the modifications of this patch become necessary. At the moment the patch has no visible effect. --- osl.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/osl.c b/osl.c index 5f58488..b9c2339 100644 --- a/osl.c +++ b/osl.c @@ -205,7 +205,6 @@ static int init_column_descriptions(struct osl_table *t) /* the size of the index header without column descriptions */ t->index_header_size = IDX_COLUMN_DESCRIPTIONS; FOR_EACH_COLUMN(i, t->desc, cd) { - struct osl_column *col = t->columns + i; if (cd->storage_flags & OSL_RBTREE) { if (!cd->compare_function) return -E_OSL_NO_COMPARE_FUNC; @@ -219,7 +218,6 @@ static int init_column_descriptions(struct osl_table *t) if (ret < 0) goto err; t->index_header_size += index_column_description_size(cd->name); - column_name_hash(cd->name, col->name_hash); ret = -E_OSL_DUPLICATE_COL_NAME; for (j = i + 1; j < t->desc->num_columns; j++) { const char *name2 = get_column_description(t->desc, @@ -553,6 +551,7 @@ __export int osl_create_table(const struct osl_table_description *desc) if (ret < 0) goto out; } + column_name_hash(cd->name, t->columns[i].name_hash); ret = -E_OSL_NOMEM; filename = column_filename(t, i); if (!filename) @@ -719,13 +718,16 @@ int map_table(struct osl_table *t, enum map_table_flags flags) } mark_table_dirty(t); num_rows = table_num_rows(t); - if (!num_rows) - return num_rows; /* map data files */ - FOR_EACH_MAPPED_COLUMN(i, t, cd) { - ret = map_column(t, i); - if (ret < 0) - goto err; + FOR_EACH_COLUMN(i, t->desc, cd) { + if (cd->storage_type == OSL_NO_STORAGE) + continue; + column_name_hash(cd->name, t->columns[i].name_hash); + if (num_rows > 0 && cd->storage_type == OSL_MAPPED_STORAGE) { + ret = map_column(t, i); + if (ret < 0) + goto err; + } } return num_rows; err: /* unmap what is already mapped */ -- 2.39.2