static svn_error_t * txn_body_write_rep(void *baton, trail_t *trail) { struct rep_args *b = (struct rep_args *) baton; representation_t *rep; SVN_ERR(svn_fs_base__parse_representation_skel(&rep, b->skel, trail->pool)); return svn_fs_bdb__write_rep(b->fs, b->key, rep, trail, trail->pool); }
svn_error_t * svn_fs_bdb__write_new_rep(const char **key, svn_fs_t *fs, const representation_t *rep, trail_t *trail, apr_pool_t *pool) { base_fs_data_t *bfd = fs->fsap_data; DBT query, result; int db_err; apr_size_t len; char next_key[MAX_KEY_SIZE]; /* ### todo: see issue #409 for why bumping the key as part of this trail is problematic. */ /* Get the current value associated with `next-key'. */ svn_fs_base__str_to_dbt(&query, NEXT_KEY_KEY); svn_fs_base__trail_debug(trail, "representations", "get"); SVN_ERR(BDB_WRAP(fs, _("allocating new representation (getting next-key)"), bfd->representations->get (bfd->representations, trail->db_txn, &query, svn_fs_base__result_dbt(&result), 0))); svn_fs_base__track_dbt(&result, pool); /* Store the new rep. */ *key = apr_pstrmemdup(pool, result.data, result.size); SVN_ERR(svn_fs_bdb__write_rep(fs, *key, rep, trail, pool)); /* Bump to future key. */ len = result.size; svn_fs_base__next_key(result.data, &len, next_key); svn_fs_base__trail_debug(trail, "representations", "put"); db_err = bfd->representations->put (bfd->representations, trail->db_txn, svn_fs_base__str_to_dbt(&query, NEXT_KEY_KEY), svn_fs_base__str_to_dbt(&result, next_key), 0); SVN_ERR(BDB_WRAP(fs, _("bumping next representation key"), db_err)); return SVN_NO_ERROR; }