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;


Reply via email to