Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_fs_base/reps-strings.c view on Meta::CPAN
apr_array_header_t *chunks;
if (rep->kind != rep_kind_delta)
return svn_error_create
(SVN_ERR_FS_GENERAL, NULL,
_("Representation is not of type 'delta'"));
/* Set up a convenience variable. */
chunks = rep->contents.delta.chunks;
/* Initialize *KEYS to an empty array. */
*keys = apr_array_make(pool, chunks->nelts, sizeof(key));
if (! chunks->nelts)
return SVN_NO_ERROR;
/* Now, push the string keys for each window into *KEYS */
for (i = 0; i < chunks->nelts; i++)
{
rep_delta_chunk_t *chunk = APR_ARRAY_IDX(chunks, i, rep_delta_chunk_t *);
key = apr_pstrdup(pool, chunk->string_key);
APR_ARRAY_PUSH(*keys, const char *) = key;
}
return SVN_NO_ERROR;
}
/* Delete the strings associated with array KEYS in FS as part of TRAIL. */
static svn_error_t *
delete_strings(const apr_array_header_t *keys,
svn_fs_t *fs,
trail_t *trail,
apr_pool_t *pool)
{
int i;
const char *str_key;
apr_pool_t *subpool = svn_pool_create(pool);
for (i = 0; i < keys->nelts; i++)
{
svn_pool_clear(subpool);
str_key = APR_ARRAY_IDX(keys, i, const char *);
SVN_ERR(svn_fs_bdb__string_delete(fs, str_key, trail, subpool));
}
svn_pool_destroy(subpool);
return SVN_NO_ERROR;
}
/*** Reading the contents from a representation. ***/
struct compose_handler_baton
{
/* The combined window, and the pool it's allocated from. */
svn_txdelta_window_t *window;
apr_pool_t *window_pool;
/* If the incoming window was self-compressed, and the combined WINDOW
exists from previous iterations, SOURCE_BUF will point to the
expanded self-compressed window. */
char *source_buf;
/* The trail for this operation. WINDOW_POOL will be a child of
TRAIL->pool. No allocations will be made from TRAIL->pool itself. */
trail_t *trail;
/* TRUE when no more windows have to be read/combined. */
svn_boolean_t done;
/* TRUE if we've just started reading a new window. We need this
because the svndiff handler will push a NULL window at the end of
the stream, and we have to ignore that; but we must also know
when it's appropriate to push a NULL window at the combiner. */
svn_boolean_t init;
};
/* Handle one window. If BATON is emtpy, copy the WINDOW into it;
otherwise, combine WINDOW with the one in BATON, unless WINDOW
is self-compressed (i.e., does not copy from the source view),
in which case expand. */
static svn_error_t *
compose_handler(svn_txdelta_window_t *window, void *baton)
{
struct compose_handler_baton *cb = baton;
SVN_ERR_ASSERT(!cb->done || window == NULL);
SVN_ERR_ASSERT(cb->trail && cb->trail->pool);
if (!cb->init && !window)
return SVN_NO_ERROR;
/* We should never get here if we've already expanded a
self-compressed window. */
SVN_ERR_ASSERT(!cb->source_buf);
if (cb->window)
{
if (window && (window->sview_len == 0 || window->src_ops == 0))
{
/* This is a self-compressed window. Don't combine it with
the others, because the combiner may go quadratic. Instead,
expand it here and signal that the combination has
ended. */
apr_size_t source_len = window->tview_len;
SVN_ERR_ASSERT(cb->window->sview_len == source_len);
cb->source_buf = apr_palloc(cb->window_pool, source_len);
svn_txdelta_apply_instructions(window, NULL,
cb->source_buf, &source_len);
cb->done = TRUE;
}
else
{
/* Combine the incoming window with whatever's in the baton. */
apr_pool_t *composite_pool = svn_pool_create(cb->trail->pool);
svn_txdelta_window_t *composite;
composite = svn_txdelta_compose_windows(window, cb->window,
composite_pool);
( run in 0.903 second using v1.01-cache-2.11-cpan-71847e10f99 )