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;