Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_subr/sqlite.c view on Meta::CPAN
err = svn_error_compose_create(err, err2);
err2 = get_internal_statement(&stmt, db,
STMT_INTERNAL_RELEASE_SAVEPOINT_SVN);
if (!err2)
err2 = svn_sqlite__step_done(stmt);
return svn_error_trace(svn_error_compose_create(err, err2));
}
SVN_ERR(get_internal_statement(&stmt, db,
STMT_INTERNAL_RELEASE_SAVEPOINT_SVN));
return svn_error_trace(svn_sqlite__step_done(stmt));
}
svn_error_t *
svn_sqlite__with_transaction(svn_sqlite__db_t *db,
svn_sqlite__transaction_callback_t cb_func,
void *cb_baton,
apr_pool_t *scratch_pool /* NULL allowed */)
{
SVN_SQLITE__WITH_TXN(cb_func(cb_baton, db, scratch_pool), db);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__with_immediate_transaction(
svn_sqlite__db_t *db,
svn_sqlite__transaction_callback_t cb_func,
void *cb_baton,
apr_pool_t *scratch_pool /* NULL allowed */)
{
SVN_SQLITE__WITH_IMMEDIATE_TXN(cb_func(cb_baton, db, scratch_pool), db);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__with_lock(svn_sqlite__db_t *db,
svn_sqlite__transaction_callback_t cb_func,
void *cb_baton,
apr_pool_t *scratch_pool /* NULL allowed */)
{
SVN_SQLITE__WITH_LOCK(cb_func(cb_baton, db, scratch_pool), db);
return SVN_NO_ERROR;
}
svn_error_t *
svn_sqlite__hotcopy(const char *src_path,
const char *dst_path,
apr_pool_t *scratch_pool)
{
svn_sqlite__db_t *src_db;
SVN_ERR(svn_sqlite__open(&src_db, src_path, svn_sqlite__mode_readonly,
NULL, 0, NULL,
scratch_pool, scratch_pool));
{
svn_sqlite__db_t *dst_db;
sqlite3_backup *backup;
int rc1, rc2;
SVN_ERR(svn_sqlite__open(&dst_db, dst_path, svn_sqlite__mode_rwcreate,
NULL, 0, NULL, scratch_pool, scratch_pool));
backup = sqlite3_backup_init(dst_db->db3, "main", src_db->db3, "main");
if (!backup)
return svn_error_createf(SVN_ERR_SQLITE_ERROR, NULL,
_("SQLite hotcopy failed for %s"), src_path);
do
{
/* Pages are usually 1024 byte (SQLite docs). On my laptop
copying gets faster as the number of pages is increased up
to about 64, beyond that speed levels off. Lets put the
number of pages an order of magnitude higher, this is still
likely to be a fraction of large databases. */
rc1 = sqlite3_backup_step(backup, 1024);
/* Should we sleep on SQLITE_OK? That would make copying a
large database take much longer. When we do sleep how,
long should we sleep? Should the sleep get longer if we
keep getting BUSY/LOCKED? I have no real reason for
choosing 25. */
if (rc1 == SQLITE_BUSY || rc1 == SQLITE_LOCKED)
sqlite3_sleep(25);
}
while (rc1 == SQLITE_OK || rc1 == SQLITE_BUSY || rc1 == SQLITE_LOCKED);
rc2 = sqlite3_backup_finish(backup);
if (rc1 != SQLITE_DONE)
SQLITE_ERR(rc1, dst_db);
SQLITE_ERR(rc2, dst_db);
SVN_ERR(svn_sqlite__close(dst_db));
}
SVN_ERR(svn_sqlite__close(src_db));
return SVN_NO_ERROR;
}
struct function_wrapper_baton_t
{
svn_sqlite__func_t func;
void *baton;
apr_pool_t *scratch_pool;
};
static void
wrapped_func(sqlite3_context *context,
int argc,
sqlite3_value *values[])
{
struct function_wrapper_baton_t *fwb = sqlite3_user_data(context);
svn_sqlite__context_t sctx;
svn_sqlite__value_t **local_vals =
apr_palloc(fwb->scratch_pool,
sizeof(svn_sqlite__value_t *) * argc);
svn_error_t *err;
int i;
sctx.context = context;
for (i = 0; i < argc; i++)
{
local_vals[i] = apr_palloc(fwb->scratch_pool, sizeof(*local_vals[i]));
local_vals[i]->value = values[i];
}
err = fwb->func(&sctx, argc, local_vals, fwb->scratch_pool);
svn_pool_clear(fwb->scratch_pool);
if (err)
{
char buf[256];
sqlite3_result_error(context,
svn_err_best_message(err, buf, sizeof(buf)),
-1);
svn_error_clear(err);
}
}
svn_error_t *
svn_sqlite__create_scalar_function(svn_sqlite__db_t *db,
const char *func_name,
int argc,
svn_sqlite__func_t func,
void *baton)
{
( run in 0.914 second using v1.01-cache-2.11-cpan-97f6503c9c8 )