Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/mod_dav_svn/activity.c view on Meta::CPAN
}
len = SVN_FS__TXN_MAX_LEN;
err = svn_io_read_length_line(activity_file, txn_name, &len, iterpool);
if (err)
{
#ifdef ESTALE
if (APR_TO_OS_ERROR(err->apr_err) == ESTALE)
continue;
#endif
break;
}
err = svn_io_file_close(activity_file, iterpool);
#ifdef ESTALE
if (err)
{
if (APR_TO_OS_ERROR(err->apr_err) == ESTALE)
{
/* No retry, just completely ignore this ESTALE. */
svn_error_clear(err);
err = SVN_NO_ERROR;
}
}
#endif
/* We have a txn_name or had a non-ESTALE close failure; either
way, we're finished. */
break;
}
svn_pool_destroy(iterpool);
/* ### let's just assume that any error means the
### activity/transaction doesn't exist */
if (err)
{
svn_error_clear(err);
return NULL;
}
return txn_name;
}
const char *
dav_svn__get_txn(const dav_svn_repos *repos, const char *activity_id)
{
return read_txn(activity_pathname(repos, activity_id), repos->pool);
}
dav_error *
dav_svn__delete_activity(const dav_svn_repos *repos, const char *activity_id)
{
dav_error *err = NULL;
const char *pathname;
const char *txn_name;
svn_error_t *serr;
/* gstein sez: If the activity ID is not in the database, return a
404. If the transaction is not present or is immutable, return a
204. For all other failures, return a 500. */
pathname = activity_pathname(repos, activity_id);
txn_name = read_txn(pathname, repos->pool);
if (txn_name == NULL)
{
return dav_svn__new_error(repos->pool, HTTP_NOT_FOUND, 0,
"could not find activity.");
}
/* After this point, we have to cleanup the value and database. */
if (*txn_name)
{
if ((err = dav_svn__abort_txn(repos, txn_name, repos->pool)))
return err;
}
/* Finally, we remove the activity from the activities database. */
serr = svn_io_remove_file2(pathname, FALSE, repos->pool);
if (serr)
err = dav_svn__convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
"unable to remove activity.",
repos->pool);
return err;
}
dav_error *
dav_svn__store_activity(const dav_svn_repos *repos,
const char *activity_id,
const char *txn_name)
{
const char *final_path;
const char *tmp_path;
const char *activity_contents;
svn_error_t *err;
/* Create activities directory if it does not yet exist. */
err = svn_io_make_dir_recursively(repos->activities_db, repos->pool);
if (err != NULL)
return dav_svn__convert_err(err, HTTP_INTERNAL_SERVER_ERROR,
"could not initialize activity db.",
repos->pool);
final_path = activity_pathname(repos, activity_id);
activity_contents = apr_psprintf(repos->pool, "%s\n%s\n",
txn_name, activity_id);
/* ### is there another directory we already have and can write to? */
err = svn_io_write_unique(&tmp_path,
svn_dirent_dirname(final_path, repos->pool),
activity_contents, strlen(activity_contents),
svn_io_file_del_none, repos->pool);
if (err)
{
svn_error_t *serr = svn_error_quick_wrap(err,
"Can't write activity db");
( run in 0.883 second using v1.01-cache-2.11-cpan-39bf76dae61 )