You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by gs...@apache.org on 2012/03/19 22:01:05 UTC

svn commit: r1302654 - in /subversion/trunk/subversion/libsvn_ra_serf: getlocks.c locks.c log.c merge.c replay.c

Author: gstein
Date: Mon Mar 19 21:01:05 2012
New Revision: 1302654

URL: http://svn.apache.org/viewvc?rev=1302654&view=rev
Log:
More work at removing __expand_string() in favor of stringbufs.

* subversion/libsvn_ra_serf/merge.c:
  (merge_info_t): switch to a stringbuf
  (push_state): create an empty stringbuf
  (start_merge): reset the stringbuf to empty. for "href" and
    "checked-in", there is no need to copy the name.
  (end_merge): grab the value from the stringbuf
  (cdata_merge): append the cdata to the stringbuf

* subversion/libsvn_ra_serf/locks.c:
  (lock_prop_info_t): removed. we'll just use a stringbuf.
  (push_state): return a stringbuf, rather than a lock_prop_info_t.
    create and store the stringbuf in the state.
  (end_lock): grab the value from the stringbuf
  (cdata_lock): append the content to the stringbuf

* subversion/libsvn_ra_serf/getlocks.c:
  (lock_info_t): store the incoming cdata into a stringbuf
  (push_state): initialize the stringbuf
  (end_getlocks): get the values from the stringbuf
  (cdata_getlocks): append the content to the stringbuf

* subversion/libsvn_ra_serf/log.c:
  (log_info_t): store the cdata into a stringbuf
  (push_state): initialize the stringbuf
  (start_log): ignore the push_state() return value in some cases
  (maybe_decode_log_cdata): get the value from the stringbuf
  (end_log): use the stringbuf value, and reset it to empty
  (cdata_log): append the content to the stringbuf

* subversion/libsvn_ra_serf/replay.c:
  (prop_info_t): store the cdata into a stringbuf
  (push_state): initialize the stringbuf
  (end_replay): fetch the value from the stringbuf
  (cdata_replay): append the content to the stringbuf

Modified:
    subversion/trunk/subversion/libsvn_ra_serf/getlocks.c
    subversion/trunk/subversion/libsvn_ra_serf/locks.c
    subversion/trunk/subversion/libsvn_ra_serf/log.c
    subversion/trunk/subversion/libsvn_ra_serf/merge.c
    subversion/trunk/subversion/libsvn_ra_serf/replay.c

Modified: subversion/trunk/subversion/libsvn_ra_serf/getlocks.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/getlocks.c?rev=1302654&r1=1302653&r2=1302654&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/getlocks.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/getlocks.c Mon Mar 19 21:01:05 2012
@@ -65,8 +65,7 @@ typedef struct lock_info_t {
   svn_lock_t *lock;
 
   /* The currently collected value as we build it up */
-  const char *tmp;
-  apr_size_t tmp_len;
+  svn_stringbuf_t *cdata;
 
 } lock_info_t;
 
@@ -101,6 +100,7 @@ push_state(svn_ra_serf__xml_parser_t *pa
 
       info->pool = lock_ctx->pool;
       info->lock = svn_lock_create(lock_ctx->pool);
+      info->cdata = svn_stringbuf_create_empty(info->pool);
 
       parser->state->private = info;
     }
@@ -211,46 +211,50 @@ end_getlocks(svn_ra_serf__xml_parser_t *
   else if (state == PATH &&
            strcmp(name.name, "path") == 0)
     {
-      info->lock->path = apr_pstrmemdup(info->pool, info->tmp, info->tmp_len);
-      info->tmp_len = 0;
+      info->lock->path = apr_pstrmemdup(info->pool,
+                                        info->cdata->data, info->cdata->len);
+      svn_stringbuf_setempty(info->cdata);
       svn_ra_serf__xml_pop_state(parser);
     }
   else if (state == TOKEN &&
            strcmp(name.name, "token") == 0)
     {
-      info->lock->token = apr_pstrmemdup(info->pool, info->tmp, info->tmp_len);
-      info->tmp_len = 0;
+      info->lock->token = apr_pstrmemdup(info->pool,
+                                         info->cdata->data, info->cdata->len);
+      svn_stringbuf_setempty(info->cdata);
       svn_ra_serf__xml_pop_state(parser);
     }
   else if (state == OWNER &&
            strcmp(name.name, "owner") == 0)
     {
-      info->lock->owner = apr_pstrmemdup(info->pool, info->tmp, info->tmp_len);
-      info->tmp_len = 0;
+      info->lock->owner = apr_pstrmemdup(info->pool,
+                                         info->cdata->data, info->cdata->len);
+      svn_stringbuf_setempty(info->cdata);
       svn_ra_serf__xml_pop_state(parser);
     }
   else if (state == COMMENT &&
            strcmp(name.name, "comment") == 0)
     {
       info->lock->comment = apr_pstrmemdup(info->pool,
-                                           info->tmp, info->tmp_len);
-      info->tmp_len = 0;
+                                           info->cdata->data,
+                                           info->cdata->len);
+      svn_stringbuf_setempty(info->cdata);
       svn_ra_serf__xml_pop_state(parser);
     }
   else if (state == CREATION_DATE &&
            strcmp(name.name, SVN_DAV__CREATIONDATE) == 0)
     {
       SVN_ERR(svn_time_from_cstring(&info->lock->creation_date,
-                                    info->tmp, info->pool));
-      info->tmp_len = 0;
+                                    info->cdata->data, info->pool));
+      svn_stringbuf_setempty(info->cdata);
       svn_ra_serf__xml_pop_state(parser);
     }
   else if (state == EXPIRATION_DATE &&
            strcmp(name.name, "expirationdate") == 0)
     {
       SVN_ERR(svn_time_from_cstring(&info->lock->expiration_date,
-                                    info->tmp, info->pool));
-      info->tmp_len = 0;
+                                    info->cdata->data, info->pool));
+      svn_stringbuf_setempty(info->cdata);
       svn_ra_serf__xml_pop_state(parser);
     }
 
@@ -280,8 +284,7 @@ cdata_getlocks(svn_ra_serf__xml_parser_t
     case COMMENT:
     case CREATION_DATE:
     case EXPIRATION_DATE:
-        svn_ra_serf__expand_string(&info->tmp, &info->tmp_len,
-                                   data, len, parser->state->pool);
+        svn_stringbuf_appendbytes(info->cdata, data, len);
         break;
       default:
         break;

Modified: subversion/trunk/subversion/libsvn_ra_serf/locks.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/locks.c?rev=1302654&r1=1302653&r2=1302654&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/locks.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/locks.c Mon Mar 19 21:01:05 2012
@@ -58,11 +58,6 @@ typedef enum lock_state_e {
   COMMENT
 } lock_state_e;
 
-typedef struct lock_prop_info_t {
-  const char *data;
-  apr_size_t len;
-} lock_prop_info_t;
-
 typedef struct lock_info_t {
   apr_pool_t *pool;
 
@@ -88,7 +83,7 @@ typedef struct lock_info_t {
 } lock_info_t;
 
 
-static lock_prop_info_t*
+static svn_stringbuf_t *
 push_state(svn_ra_serf__xml_parser_t *parser,
            lock_info_t *lock_ctx,
            lock_state_e state)
@@ -102,8 +97,8 @@ push_state(svn_ra_serf__xml_parser_t *pa
     case TIMEOUT:
     case LOCK_TOKEN:
     case COMMENT:
-        parser->state->private = apr_pcalloc(parser->state->pool,
-                                             sizeof(lock_prop_info_t));
+        parser->state->private =
+          svn_stringbuf_create_empty(parser->state->pool);
         break;
       default:
         break;
@@ -239,7 +234,7 @@ end_lock(svn_ra_serf__xml_parser_t *pars
   else if (state == TIMEOUT &&
            strcmp(name.name, "timeout") == 0)
     {
-      lock_prop_info_t *info = parser->state->private;
+      svn_stringbuf_t *info = parser->state->private;
 
       if (strcmp(info->data, "Infinite") == 0)
         {
@@ -255,12 +250,12 @@ end_lock(svn_ra_serf__xml_parser_t *pars
   else if (state == LOCK_TOKEN &&
            strcmp(name.name, "locktoken") == 0)
     {
-      lock_prop_info_t *info = parser->state->private;
+      svn_stringbuf_t *info = parser->state->private;
 
       if (!ctx->lock->token && info->len)
         {
-          apr_collapse_spaces((char*)info->data, info->data);
-          ctx->lock->token = apr_pstrndup(ctx->pool, info->data, info->len);
+          apr_collapse_spaces(info->data, info->data);
+          ctx->lock->token = apr_pstrmemdup(ctx->pool, info->data, info->len);
         }
       /* We don't actually need the lock token. */
       svn_ra_serf__xml_pop_state(parser);
@@ -268,11 +263,12 @@ end_lock(svn_ra_serf__xml_parser_t *pars
   else if (state == COMMENT &&
            strcmp(name.name, "owner") == 0)
     {
-      lock_prop_info_t *info = parser->state->private;
+      svn_stringbuf_t *info = parser->state->private;
 
       if (info->len)
         {
-          ctx->lock->comment = apr_pstrndup(ctx->pool, info->data, info->len);
+          ctx->lock->comment = apr_pstrmemdup(ctx->pool,
+                                              info->data, info->len);
         }
       svn_ra_serf__xml_pop_state(parser);
     }
@@ -288,7 +284,7 @@ cdata_lock(svn_ra_serf__xml_parser_t *pa
 {
   lock_info_t *lock_ctx = userData;
   lock_state_e state;
-  lock_prop_info_t *info;
+  svn_stringbuf_t *info;
 
   UNUSED_CTX(lock_ctx);
 
@@ -303,9 +299,9 @@ cdata_lock(svn_ra_serf__xml_parser_t *pa
     case TIMEOUT:
     case LOCK_TOKEN:
     case COMMENT:
-        svn_ra_serf__expand_string(&info->data, &info->len,
-                                   data, len, parser->state->pool);
+        svn_stringbuf_appendbytes(info, data, len);
         break;
+
       default:
         break;
     }

Modified: subversion/trunk/subversion/libsvn_ra_serf/log.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/log.c?rev=1302654&r1=1302653&r2=1302654&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/log.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/log.c Mon Mar 19 21:01:05 2012
@@ -39,6 +39,7 @@
 #include "svn_props.h"
 
 #include "private/svn_dav_protocol.h"
+#include "private/svn_string_private.h"
 #include "svn_private_config.h"
 
 #include "ra_serf.h"
@@ -71,8 +72,7 @@ typedef struct log_info_t {
   /* The currently collected value as we build it up, and its wire
    * encoding (if any).
    */
-  const char *tmp;
-  apr_size_t tmp_len;
+  svn_stringbuf_t *tmp;
   const char *tmp_encoding;
 
   /* Temporary change path - ultimately inserted into changed_paths hash. */
@@ -130,6 +130,7 @@ push_state(svn_ra_serf__xml_parser_t *pa
 
       info = apr_pcalloc(info_pool, sizeof(*info));
       info->pool = info_pool;
+      info->tmp = svn_stringbuf_create_empty(info_pool);
       info->log_entry = svn_log_entry_create(info_pool);
 
       info->log_entry->revision = SVN_INVALID_REVNUM;
@@ -218,15 +219,15 @@ start_log(svn_ra_serf__xml_parser_t *par
         }
       else if (strcmp(name.name, "creator-displayname") == 0)
         {
-          info = push_state(parser, log_ctx, CREATOR, attrs);
+          push_state(parser, log_ctx, CREATOR, attrs);
         }
       else if (strcmp(name.name, "date") == 0)
         {
-          info = push_state(parser, log_ctx, DATE, attrs);
+          push_state(parser, log_ctx, DATE, attrs);
         }
       else if (strcmp(name.name, "comment") == 0)
         {
-          info = push_state(parser, log_ctx, COMMENT, attrs);
+          push_state(parser, log_ctx, COMMENT, attrs);
         }
       else if (strcmp(name.name, "revprop") == 0)
         {
@@ -321,11 +322,12 @@ static svn_error_t *
 maybe_decode_log_cdata(const svn_string_t **decoded_cdata,
                        log_info_t *info)
 {
+
   if (info->tmp_encoding)
     {
-      svn_string_t in;
-      in.data = info->tmp;
-      in.len = info->tmp_len;
+      const svn_string_t *morph;
+
+      morph = svn_stringbuf__morph_into_string(info->tmp);
 
       /* Check for a known encoding type.  This is easy -- there's
          only one.  */
@@ -336,12 +338,11 @@ maybe_decode_log_cdata(const svn_string_
                                    info->tmp_encoding);
         }
 
-      *decoded_cdata = svn_base64_decode_string(&in, info->pool);
+      *decoded_cdata = svn_base64_decode_string(morph, info->pool);
     }
   else
     {
-      *decoded_cdata = svn_string_ncreate(info->tmp, info->tmp_len,
-                                          info->pool);
+      *decoded_cdata = svn_string_create_from_buf(info->tmp, info->pool);
     }
   return SVN_NO_ERROR;
 }
@@ -393,8 +394,8 @@ end_log(svn_ra_serf__xml_parser_t *parse
   else if (state == VERSION &&
            strcmp(name.name, SVN_DAV__VERSION_NAME) == 0)
     {
-      info->log_entry->revision = SVN_STR_TO_REV(info->tmp);
-      info->tmp_len = 0;
+      info->log_entry->revision = SVN_STR_TO_REV(info->tmp->data);
+      svn_stringbuf_setempty(info->tmp);
       svn_ra_serf__xml_pop_state(parser);
     }
   else if (state == CREATOR &&
@@ -407,7 +408,7 @@ end_log(svn_ra_serf__xml_parser_t *parse
           apr_hash_set(info->log_entry->revprops, SVN_PROP_REVISION_AUTHOR,
                        APR_HASH_KEY_STRING, decoded_cdata);
         }
-      info->tmp_len = 0;
+      svn_stringbuf_setempty(info->tmp);
       svn_ra_serf__xml_pop_state(parser);
     }
   else if (state == DATE &&
@@ -420,7 +421,7 @@ end_log(svn_ra_serf__xml_parser_t *parse
           apr_hash_set(info->log_entry->revprops, SVN_PROP_REVISION_DATE,
                        APR_HASH_KEY_STRING, decoded_cdata);
         }
-      info->tmp_len = 0;
+      svn_stringbuf_setempty(info->tmp);
       svn_ra_serf__xml_pop_state(parser);
     }
   else if (state == COMMENT &&
@@ -433,7 +434,7 @@ end_log(svn_ra_serf__xml_parser_t *parse
           apr_hash_set(info->log_entry->revprops, SVN_PROP_REVISION_LOG,
                        APR_HASH_KEY_STRING, decoded_cdata);
         }
-      info->tmp_len = 0;
+      svn_stringbuf_setempty(info->tmp);
       svn_ra_serf__xml_pop_state(parser);
     }
   else if (state == REVPROP)
@@ -442,7 +443,7 @@ end_log(svn_ra_serf__xml_parser_t *parse
       SVN_ERR(maybe_decode_log_cdata(&decoded_cdata, info));
       apr_hash_set(info->log_entry->revprops, info->revprop_name,
                    APR_HASH_KEY_STRING, decoded_cdata);
-      info->tmp_len = 0;
+      svn_stringbuf_setempty(info->tmp);
       svn_ra_serf__xml_pop_state(parser);
     }
   else if (state == HAS_CHILDREN &&
@@ -468,8 +469,8 @@ end_log(svn_ra_serf__xml_parser_t *parse
     {
       char *path;
 
-      path = apr_pstrmemdup(info->pool, info->tmp, info->tmp_len);
-      info->tmp_len = 0;
+      path = apr_pstrmemdup(info->pool, info->tmp->data, info->tmp->len);
+      svn_stringbuf_setempty(info->tmp);
 
       apr_hash_set(info->log_entry->changed_paths2, path, APR_HASH_KEY_STRING,
                    info->tmp_path);
@@ -505,9 +506,9 @@ cdata_log(svn_ra_serf__xml_parser_t *par
       case REPLACED_PATH:
       case DELETED_PATH:
       case MODIFIED_PATH:
-        svn_ra_serf__expand_string(&info->tmp, &info->tmp_len,
-                                   data, len, info->pool);
+        svn_stringbuf_appendbytes(info->tmp, data, len);
         break;
+
       default:
         break;
     }

Modified: subversion/trunk/subversion/libsvn_ra_serf/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/merge.c?rev=1302654&r1=1302653&r2=1302654&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/merge.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/merge.c Mon Mar 19 21:01:05 2012
@@ -80,8 +80,8 @@ typedef struct merge_info_t {
 
   const char *prop_ns;
   const char *prop_name;
-  const char *prop_val;
-  apr_size_t prop_val_len;
+  svn_stringbuf_t *prop_value;
+
 } merge_info_t;
 
 /* Structure associated with a MERGE request. */
@@ -119,6 +119,7 @@ push_state(svn_ra_serf__xml_parser_t *pa
       info = apr_palloc(parser->state->pool, sizeof(*info));
       info->pool = parser->state->pool;
       info->props = apr_hash_make(info->pool);
+      info->prop_value = svn_stringbuf_create_empty(info->pool);
 
       parser->state->private = info;
     }
@@ -163,9 +164,8 @@ start_merge(svn_ra_serf__xml_parser_t *p
       info = push_state(parser, ctx, PROP_VAL);
 
       info->prop_ns = name.namespace;
-      info->prop_name = apr_pstrdup(info->pool, name.name);
-      info->prop_val = NULL;
-      info->prop_val_len = 0;
+      info->prop_name = "href";
+      svn_stringbuf_setempty(info->prop_value);
     }
   else if (state == RESPONSE &&
            strcmp(name.name, "propstat") == 0)
@@ -206,11 +206,9 @@ start_merge(svn_ra_serf__xml_parser_t *p
            strcmp(name.name, "checked-in") == 0)
     {
       info = push_state(parser, ctx, IGNORE_PROP_NAME);
-
       info->prop_ns = name.namespace;
-      info->prop_name = apr_pstrdup(info->pool, name.name);
-      info->prop_val = NULL;
-      info->prop_val_len = 0;
+      info->prop_name = "checked-in";
+      svn_stringbuf_setempty(info->prop_value);
     }
   else if (state == PROP)
     {
@@ -225,8 +223,7 @@ start_merge(svn_ra_serf__xml_parser_t *p
       info = push_state(parser, ctx, PROP_VAL);
       info->prop_ns = name.namespace;
       info->prop_name = apr_pstrdup(info->pool, name.name);
-      info->prop_val = NULL;
-      info->prop_val_len = 0;
+      svn_stringbuf_setempty(info->prop_value);
     }
   else
     {
@@ -349,24 +346,27 @@ end_merge(svn_ra_serf__xml_parser_t *par
     }
   else if (state == PROP_VAL)
     {
+      const char *value;
+
       if (!info->prop_name)
         {
+          /* ### gstein sez: dunno what this is about.  */
           info->prop_name = apr_pstrdup(info->pool, name.name);
         }
-      info->prop_val = apr_pstrmemdup(info->pool, info->prop_val,
-                                      info->prop_val_len);
+
       if (strcmp(info->prop_name, "href") == 0)
-        info->prop_val = svn_urlpath__canonicalize(info->prop_val,
-                                                       info->pool);
+        value = svn_urlpath__canonicalize(info->prop_value->data, info->pool);
+      else
+        value = apr_pstrmemdup(info->pool,
+                               info->prop_value->data, info->prop_value->len);
 
       /* Set our property. */
       apr_hash_set(info->props, info->prop_name, APR_HASH_KEY_STRING,
-                   info->prop_val);
+                   value);
 
       info->prop_ns = NULL;
       info->prop_name = NULL;
-      info->prop_val = NULL;
-      info->prop_val_len = 0;
+      svn_stringbuf_setempty(info->prop_value);
 
       svn_ra_serf__xml_pop_state(parser);
     }
@@ -390,10 +390,7 @@ cdata_merge(svn_ra_serf__xml_parser_t *p
   info = parser->state->private;
 
   if (state == PROP_VAL)
-    {
-      svn_ra_serf__expand_string(&info->prop_val, &info->prop_val_len,
-                                 data, len, parser->state->pool);
-    }
+    svn_stringbuf_appendbytes(info->prop_value, data, len);
 
   return SVN_NO_ERROR;
 }

Modified: subversion/trunk/subversion/libsvn_ra_serf/replay.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/replay.c?rev=1302654&r1=1302653&r2=1302654&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/replay.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/replay.c Mon Mar 19 21:01:05 2012
@@ -40,6 +40,8 @@
 #include "svn_path.h"
 #include "svn_private_config.h"
 
+#include "private/svn_string_private.h"
+
 #include "ra_serf.h"
 
 
@@ -83,8 +85,7 @@ typedef struct prop_info_t {
   const char *name;
   svn_boolean_t del_prop;
 
-  const char *data;
-  apr_size_t len;
+  svn_stringbuf_t *prop_value;
 
   replay_info_t *parent;
 } prop_info_t;
@@ -165,6 +166,7 @@ push_state(svn_ra_serf__xml_parser_t *pa
 
       info->pool = replay_ctx->dst_rev_pool;
       info->parent = parser->state->private;
+      info->prop_value = svn_stringbuf_create_empty(info->pool);
 
       parser->state->private = info;
     }
@@ -533,15 +535,14 @@ end_replay(svn_ra_serf__xml_parser_t *pa
         }
       else
         {
-          svn_string_t tmp_prop;
+          const svn_string_t *morph;
 
-          tmp_prop.data = info->data;
-          tmp_prop.len = info->len;
+          morph = svn_stringbuf__morph_into_string(info->prop_value);
 
           if (strcmp(name.name, "change-file-prop") == 0)
-            prop_val = svn_base64_decode_string(&tmp_prop, ctx->file_pool);
+            prop_val = svn_base64_decode_string(morph, ctx->file_pool);
           else
-            prop_val = svn_base64_decode_string(&tmp_prop, ctx->dst_rev_pool);
+            prop_val = svn_base64_decode_string(morph, ctx->dst_rev_pool);
         }
 
       SVN_ERR(info->change(info->parent->baton, info->name, prop_val,
@@ -582,8 +583,7 @@ cdata_replay(svn_ra_serf__xml_parser_t *
     {
       prop_info_t *info = parser->state->private;
 
-      svn_ra_serf__expand_string(&info->data, &info->len,
-                                 data, len, parser->state->pool);
+      svn_stringbuf_appendbytes(info->prop_value, data, len);
     }
 
   return SVN_NO_ERROR;