Author: stefan2
Date: Thu May 16 14:26:01 2013
New Revision: 1483386
URL: http://svn.apache.org/r1483386
Log:
On the fsfs-format7 branch: Tweak the string table getter APIs to
also return the size of the string. Update tests and callers.
Finally, drop an unused API
* subversion/libsvn_fs_fs/string_table.h
(svn_fs_fs__string_table_copy_string): drop
(svn_fs_fs__string_table_get,
svn_fs_fs__string_table_get_func): add LENGTH out parameter
* subversion/libsvn_fs_fs/string_table.c
(svn_fs_fs__string_table_copy_string): drop
(svn_fs_fs__string_table_get,
svn_fs_fs__string_table_get_func): update implementation
* subversion/libsvn_fs_fs/changes.c
(svn_fs_fs__changes_get_list,
svn_fs_fs__changes_get_list_func): update callers
* subversion/libsvn_fs_fs/noderevs.c
(svn_fs_fs__noderevs_get,
svn_fs_fs__noderevs_get_func): ditto
* subversion/tests/libsvn_fs_fs/string-table-test.c
(create_empty_table_body,
short_string_table_body,
large_string_table_body,
many_strings_table_body): update tests
Modified:
subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/changes.c
subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/noderevs.c
subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.c
subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.h
subversion/branches/fsfs-format7/subversion/tests/libsvn_fs_fs/string-table-test.c
Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/changes.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/changes.c?rev=1483386&r1=1483385&r2=1483386&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/changes.c
(original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/changes.c Thu May
16 14:26:01 2013
@@ -262,6 +262,7 @@ svn_fs_fs__changes_get_list(apr_array_he
change_t *change = apr_pcalloc(pool, sizeof(*change));
change->path = svn_fs_fs__string_table_get(changes->paths,
binary_change->path,
+ NULL,
pool);
if (svn_fs_fs__id_txn_used(&binary_change->rev_id))
@@ -288,6 +289,7 @@ svn_fs_fs__changes_get_list(apr_array_he
change->copyfrom_path
= svn_fs_fs__string_table_get(changes->paths,
binary_change->copyfrom_path,
+ NULL,
pool);
/* add it to the result */
@@ -530,6 +532,7 @@ svn_fs_fs__changes_get_list_func(void **
change_t *change = apr_pcalloc(pool, sizeof(*change));
change->path = svn_fs_fs__string_table_get_func(paths,
binary_change->path,
+ NULL,
pool);
if (svn_fs_fs__id_txn_used(&binary_change->rev_id))
@@ -556,6 +559,7 @@ svn_fs_fs__changes_get_list_func(void **
change->copyfrom_path
= svn_fs_fs__string_table_get_func(paths,
binary_change->copyfrom_path,
+ NULL,
pool);
/* add it to the result */
Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/noderevs.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/noderevs.c?rev=1483386&r1=1483385&r2=1483386&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/noderevs.c
(original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/noderevs.c Thu May
16 14:26:01 2013
@@ -485,6 +485,7 @@ svn_fs_fs__noderevs_get(node_revision_t
noderev->copyfrom_path
= svn_fs_fs__string_table_get(container->paths,
binary_noderev->copyfrom_path,
+ NULL,
pool);
noderev->copyfrom_rev = binary_noderev->copyfrom_rev;
}
@@ -499,6 +500,7 @@ svn_fs_fs__noderevs_get(node_revision_t
noderev->copyroot_path
= svn_fs_fs__string_table_get(container->paths,
binary_noderev->copyroot_path,
+ NULL,
pool);
noderev->copyroot_rev = binary_noderev->copyroot_rev;
}
@@ -526,6 +528,7 @@ svn_fs_fs__noderevs_get(node_revision_t
noderev->created_path
= svn_fs_fs__string_table_get(container->paths,
binary_noderev->created_path,
+ NULL,
pool);
noderev->mergeinfo_count = binary_noderev->mergeinfo_count;
@@ -957,6 +960,7 @@ svn_fs_fs__noderevs_get_func(void **out,
noderev->copyfrom_path
= svn_fs_fs__string_table_get_func(paths,
binary_noderev->copyfrom_path,
+ NULL,
pool);
noderev->copyfrom_rev = binary_noderev->copyfrom_rev;
}
@@ -971,6 +975,7 @@ svn_fs_fs__noderevs_get_func(void **out,
noderev->copyroot_path
= svn_fs_fs__string_table_get_func(paths,
binary_noderev->copyroot_path,
+ NULL,
pool);
noderev->copyroot_rev = binary_noderev->copyroot_rev;
}
@@ -998,6 +1003,7 @@ svn_fs_fs__noderevs_get_func(void **out,
noderev->created_path
= svn_fs_fs__string_table_get_func(paths,
binary_noderev->created_path,
+ NULL,
pool);
noderev->mergeinfo_count = binary_noderev->mergeinfo_count;
Modified:
subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.c?rev=1483386&r1=1483385&r2=1483386&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.c
(original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.c Thu
May 16 14:26:01 2013
@@ -491,6 +491,7 @@ table_copy_string(char *buffer,
const char*
svn_fs_fs__string_table_get(const string_table_t *table,
apr_size_t idx,
+ apr_size_t *length,
apr_pool_t *pool)
{
apr_size_t table_number = idx >> TABLE_SHIFT;
@@ -502,9 +503,14 @@ svn_fs_fs__string_table_get(const string
if (idx & LONG_STRING_MASK)
{
if (sub_index < sub_table->long_string_count)
- return apr_pstrmemdup(pool,
- sub_table->long_strings[sub_index].data,
- sub_table->long_strings[sub_index].len);
+ {
+ if (length)
+ *length = sub_table->long_strings[sub_index].len;
+
+ return apr_pstrmemdup(pool,
+ sub_table->long_strings[sub_index].data,
+ sub_table->long_strings[sub_index].len);
+ }
}
else
{
@@ -513,6 +519,9 @@ svn_fs_fs__string_table_get(const string
string_header_t *header = sub_table->short_strings + sub_index;
apr_size_t len = header->head_length + header->tail_length + 1;
char *result = apr_palloc(pool, len);
+
+ if (length)
+ *length = len - 1;
table_copy_string(result, len, sub_table, header);
return result;
@@ -523,52 +532,6 @@ svn_fs_fs__string_table_get(const string
return apr_pstrmemdup(pool, "", 0);
}
-apr_size_t
-svn_fs_fs__string_table_copy_string(char *buffer,
- apr_size_t size,
- const string_table_t *table,
- apr_size_t idx)
-{
- apr_size_t table_number = idx >> TABLE_SHIFT;
- apr_size_t sub_index = idx & STRING_INDEX_MASK;
-
- if (table_number < table->size)
- {
- string_sub_table_t *sub_table = &table->sub_tables[table_number];
- if (idx & LONG_STRING_MASK)
- {
- if (sub_index < sub_table->long_string_count)
- {
- apr_size_t len = sub_table->long_strings[sub_index].len;
- if (size > len)
- memcpy(buffer, sub_table->long_strings[sub_index].data,
- len + 1);
- else if (size == len)
- memcpy(buffer, sub_table->long_strings[sub_index].data, len);
-
- return len;
- }
- }
- else
- {
- if (sub_index < sub_table->short_string_count)
- {
- string_header_t *header = sub_table->short_strings + sub_index;
- apr_size_t len = header->head_length + header->tail_length;
- if (size >= len)
- table_copy_string(buffer, size, sub_table, header);
-
- return len;
- }
- }
- }
-
- if (size > 0)
- buffer[0] = '\0';
-
- return 0;
-}
-
svn_error_t *
svn_fs_fs__write_string_table(svn_stream_t *stream,
const string_table_t *table,
@@ -815,6 +778,7 @@ svn_fs_fs__deserialize_string_table(void
const char*
svn_fs_fs__string_table_get_func(const string_table_t *table,
apr_size_t idx,
+ apr_size_t *length,
apr_pool_t *pool)
{
apr_size_t table_number = idx >> TABLE_SHIFT;
@@ -843,6 +807,9 @@ svn_fs_fs__string_table_get_func(const s
(const void *const *)&long_strings[sub_index].data);
/* return a copy of the char data */
+ if (length)
+ *length = long_strings[sub_index].len;
+
return apr_pstrmemdup(pool,
str_data,
long_strings[sub_index].len);
@@ -873,6 +840,9 @@ svn_fs_fs__string_table_get_func(const s
len = header->head_length + header->tail_length + 1;
result = apr_palloc(pool, len);
+
+ if (length)
+ *length = len + 1;
table_copy_string(result, len, &table_copy, header);
return result;
Modified:
subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.h
URL:
http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.h?rev=1483386&r1=1483385&r2=1483386&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.h
(original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/string_table.h Thu
May 16 14:26:01 2013
@@ -76,30 +76,15 @@ svn_fs_fs__string_table_create(const str
apr_pool_t *pool);
/* Extract string number INDEX from TABLE and return a copy of it allocated
- * in POOL. Returns an empty string for invalid indexes.
+ * in POOL. If LENGTH is not NULL, set *LENGTH to strlen() of the result
+ * string. Returns an empty string for invalid indexes.
*/
const char*
svn_fs_fs__string_table_get(const string_table_t *table,
apr_size_t index,
+ apr_size_t *length,
apr_pool_t *pool);
-/* Copy the string number INDEX from TABLE to BUFFER and return the length
- * of the string (without terminating NUL). SIZE specifies the length of
- * the BUFFER in bytes. You may call this function with BUFFER and SIZE
- * both set to 0 to retrieve the length of the string.
- *
- * If SIZE is smaller than the string length, the buffer content will not
- * be changed, i.e. no part of the string get copied. If it is equal to
- * the length, the string gets copied but no terminating NUL will be added.
- * If the SIZE is larger than the string length, the terminating NUL will
- * will be added.
- */
-apr_size_t
-svn_fs_fs__string_table_copy_string(char *buffer,
- apr_size_t size,
- const string_table_t *table,
- apr_size_t index);
-
/* Write a serialized representation of the string table TABLE to STREAM.
* Use POOL for temporary allocations.
*/
@@ -131,12 +116,14 @@ svn_fs_fs__deserialize_string_table(void
string_table_t **table);
/* Extract string number INDEX from the cache serialized representation at
- * TABLE and return a copy of it allocated in POOL. Returns an empty string
+ * TABLE and return a copy of it allocated in POOL. If LENGTH is not NULL,
+ * set *LENGTH to strlen() of the result string. Returns an empty string
* for invalid indexes.
*/
const char*
svn_fs_fs__string_table_get_func(const string_table_t *table,
apr_size_t idx,
+ apr_size_t *length,
apr_pool_t *pool);
#ifdef __cplusplus
Modified:
subversion/branches/fsfs-format7/subversion/tests/libsvn_fs_fs/string-table-test.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/libsvn_fs_fs/string-table-test.c?rev=1483386&r1=1483385&r2=1483386&view=diff
==============================================================================
---
subversion/branches/fsfs-format7/subversion/tests/libsvn_fs_fs/string-table-test.c
(original)
+++
subversion/branches/fsfs-format7/subversion/tests/libsvn_fs_fs/string-table-test.c
Thu May 16 14:26:01 2013
@@ -109,12 +109,12 @@ create_empty_table_body(svn_boolean_t do
string_table_t *table
= svn_fs_fs__string_table_create(builder, pool);
- SVN_TEST_STRING_ASSERT(svn_fs_fs__string_table_get(table, 0, pool), "");
+ SVN_TEST_STRING_ASSERT(svn_fs_fs__string_table_get(table, 0, NULL, pool),
"");
if (do_load_store)
SVN_ERR(store_and_load_table(&table, pool));
- SVN_TEST_ASSERT(svn_fs_fs__string_table_copy_string(NULL, 0, table, 0) == 0);
+ SVN_TEST_STRING_ASSERT(svn_fs_fs__string_table_get(table, 0, NULL, pool),
"");
return SVN_NO_ERROR;
}
@@ -140,32 +140,17 @@ short_string_table_body(svn_boolean_t do
SVN_TEST_ASSERT(indexes[2] == indexes[6]);
for (i = 0; i < STRING_COUNT; ++i)
{
- char long_buffer[100] = { 0 };
- char short_buffer[10] = { 0 };
+ apr_size_t len;
const char *string
- = svn_fs_fs__string_table_get(table, indexes[i], pool);
- apr_size_t len
- = svn_fs_fs__string_table_copy_string(NULL, 0, table, indexes[i]);
- apr_size_t long_len
- = svn_fs_fs__string_table_copy_string(long_buffer,
- sizeof(long_buffer),
- table, indexes[i]);
- apr_size_t short_len
- = svn_fs_fs__string_table_copy_string(short_buffer,
- sizeof(short_buffer),
- table, indexes[i]);
+ = svn_fs_fs__string_table_get(table, indexes[i], &len, pool);
SVN_TEST_STRING_ASSERT(string, basic_strings[i]);
+ SVN_TEST_ASSERT(len == strlen(string));
SVN_TEST_ASSERT(len == strlen(basic_strings[i]));
- SVN_TEST_ASSERT(long_len == strlen(basic_strings[i]));
- SVN_TEST_ASSERT(short_len == strlen(basic_strings[i]));
-
- SVN_TEST_STRING_ASSERT(long_buffer, basic_strings[i]);
- SVN_TEST_STRING_ASSERT(short_buffer, "");
}
- SVN_TEST_STRING_ASSERT(svn_fs_fs__string_table_get(table, STRING_COUNT,
pool), "");
- SVN_TEST_ASSERT(svn_fs_fs__string_table_copy_string(NULL, 0, table,
STRING_COUNT) == 0);
+ SVN_TEST_STRING_ASSERT(svn_fs_fs__string_table_get(table, STRING_COUNT,
+ NULL, pool), "");
return SVN_NO_ERROR;
}
@@ -196,28 +181,13 @@ large_string_table_body(svn_boolean_t do
for (i = 0; i < COUNT; ++i)
{
- char long_buffer[73000 + 1000 * COUNT] = { 0 };
- char short_buffer[100] = { 0 };
+ apr_size_t len;
const char *string
- = svn_fs_fs__string_table_get(table, indexes[i], pool);
- apr_size_t len
- = svn_fs_fs__string_table_copy_string(NULL, 0, table, indexes[i]);
- apr_size_t long_len
- = svn_fs_fs__string_table_copy_string(long_buffer,
- sizeof(long_buffer),
- table, indexes[i]);
- apr_size_t short_len
- = svn_fs_fs__string_table_copy_string(short_buffer,
- sizeof(short_buffer),
- table, indexes[i]);
+ = svn_fs_fs__string_table_get(table, indexes[i], &len, pool);
SVN_TEST_STRING_ASSERT(string, strings[i]->data);
+ SVN_TEST_ASSERT(len == strlen(string));
SVN_TEST_ASSERT(len == strings[i]->len);
- SVN_TEST_ASSERT(long_len == strings[i]->len);
- SVN_TEST_ASSERT(short_len == strings[i]->len);
-
- SVN_TEST_STRING_ASSERT(long_buffer, strings[i]->data);
- SVN_TEST_STRING_ASSERT(short_buffer, "");
}
return SVN_NO_ERROR;
@@ -250,29 +220,13 @@ many_strings_table_body(svn_boolean_t do
for (i = 0; i < COUNT; ++i)
{
- char long_buffer[23000] = { 0 };
- char short_buffer[100] = { 0 };
+ apr_size_t len;
const char *string
- = svn_fs_fs__string_table_get(table, indexes[i], pool);
- apr_size_t len
- = svn_fs_fs__string_table_copy_string(NULL, 0, table, indexes[i]);
- apr_size_t long_len
- = svn_fs_fs__string_table_copy_string(long_buffer,
- sizeof(long_buffer),
- table, indexes[i]);
- apr_size_t short_len
- = svn_fs_fs__string_table_copy_string(short_buffer,
- sizeof(short_buffer),
- table, indexes[i]);
+ = svn_fs_fs__string_table_get(table, indexes[i], &len, pool);
SVN_TEST_STRING_ASSERT(string, strings[i]->data);
+ SVN_TEST_ASSERT(len == strlen(string));
SVN_TEST_ASSERT(len == strings[i]->len);
- SVN_TEST_ASSERT(long_len == strings[i]->len);
- SVN_TEST_ASSERT(short_len == strings[i]->len);
-
- SVN_TEST_STRING_ASSERT(long_buffer, strings[i]->data);
- if (len > sizeof(short_buffer))
- SVN_TEST_STRING_ASSERT(short_buffer, "");
}
return SVN_NO_ERROR;