📄 deadprops.c
字号:
xml_safe = propval->data;
encoding = apr_pstrcat(pool, " V:encoding=\"base64\"", NULL);
}
else
{
svn_stringbuf_t *xmlval = NULL;
svn_xml_escape_cdata_string(&xmlval, propval, pool);
xml_safe = xmlval->data;
}
s = apr_psprintf(pool, "<%s%s%s>", prefix, name->name, encoding);
apr_text_append(pool, phdr, s);
/* the value is in our pool which means it has the right lifetime. */
/* ### at least, per the current mod_dav architecture/API */
apr_text_append(pool, phdr, xml_safe);
s = apr_psprintf(pool, "</%s%s>" DEBUG_CR, prefix, name->name);
apr_text_append(pool, phdr, s);
}
return NULL;
}
static dav_error *dav_svn_db_map_namespaces(
dav_db *db,
const apr_array_header_t *namespaces,
dav_namespace_map **mapping)
{
/* we don't need a namespace mapping right now. nothing to do */
return NULL;
}
static dav_error *dav_svn_db_store(dav_db *db, const dav_prop_name *name,
const apr_xml_elem *elem,
dav_namespace_map *mapping)
{
svn_string_t *propval = apr_pcalloc(db->p, sizeof(*propval));
apr_pool_t *pool = db->p;
apr_xml_attr *attr = elem->attr;
/* SVN sends property values as a big blob of bytes. Thus, there should be
no child elements of the property-name element. That also means that
the entire contents of the blob is located in elem->first_cdata. The
dav_xml_get_cdata() will figure it all out for us, but (normally) it
should be awfully fast and not need to copy any data. */
propval->data = dav_xml_get_cdata(elem, pool, 0 /* strip_white */);
propval->len = strlen(propval->data);
/* Check for special encodings of the property value. */
while (attr)
{
if (strcmp (attr->name, "encoding") == 0) /* ### namespace check? */
{
const char *enc_type = attr->value;
/* Handle known encodings here. */
if (enc_type && (strcmp (enc_type, "base64") == 0))
propval = (svn_string_t *)svn_base64_decode_string(propval, pool);
else
return dav_new_error (pool, HTTP_INTERNAL_SERVER_ERROR, 0,
"Unknown property encoding");
break;
}
/* Next attribute, please. */
attr = attr->next;
}
return save_value(db, name, propval);
}
static dav_error *dav_svn_db_remove(dav_db *db, const dav_prop_name *name)
{
svn_error_t *serr;
const char *propname;
/* get the repos-local name */
get_repos_propname(db, name, &propname);
/* ### non-svn props aren't in our repos, so punt for now */
if (propname == NULL)
return NULL;
/* Working Baseline or Working (Version) Resource */
if (db->resource->baselined)
if (db->resource->working)
serr = svn_repos_fs_change_txn_prop(db->resource->info->root.txn,
propname, NULL, db->resource->pool);
else
/* ### VIOLATING deltaV: you can't proppatch a baseline, it's
not a working resource! But this is how we currently
(hackily) allow the svn client to change unversioned rev
props. See issue #916. */
serr = svn_repos_fs_change_rev_prop2(db->resource->info->repos->repos,
db->resource->info->root.rev,
db->resource->info->repos->username,
propname, NULL,
db->authz_read_func,
db->authz_read_baton,
db->resource->pool);
else
serr = svn_repos_fs_change_node_prop(db->resource->info->root.root,
get_repos_path(db->resource->info),
propname, NULL, db->resource->pool);
if (serr != NULL)
return dav_svn_convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
"could not remove a property",
db->resource->pool);
/* a change to the props was made; make sure our cached copy is gone */
db->props = NULL;
return NULL;
}
static int dav_svn_db_exists(dav_db *db, const dav_prop_name *name)
{
const char *propname;
svn_string_t *propval;
svn_error_t *serr;
int retval;
/* get the repos-local name */
get_repos_propname(db, name, &propname);
/* ### non-svn props aren't in our repos */
if (propname == NULL)
return 0;
/* Working Baseline, Baseline, or (Working) Version resource */
if (db->resource->baselined)
if (db->resource->type == DAV_RESOURCE_TYPE_WORKING)
serr = svn_fs_txn_prop(&propval, db->resource->info->root.txn,
propname, db->p);
else
serr = svn_repos_fs_revision_prop(&propval,
db->resource->info->repos->repos,
db->resource->info->root.rev,
propname,
db->authz_read_func,
db->authz_read_baton, db->p);
else
serr = svn_fs_node_prop(&propval, db->resource->info->root.root,
get_repos_path(db->resource->info),
propname, db->p);
/* ### try and dispose of the value? */
retval = (serr == NULL && propval != NULL);
svn_error_clear(serr);
return retval;
}
static void get_name(dav_db *db, dav_prop_name *pname)
{
if (db->hi == NULL)
{
pname->ns = pname->name = NULL;
}
else
{
const void *name;
apr_hash_this(db->hi, &name, NULL, NULL);
#define PREFIX_LEN (sizeof(SVN_PROP_PREFIX) - 1)
if (strncmp(name, SVN_PROP_PREFIX, PREFIX_LEN) == 0)
#undef PREFIX_LEN
{
pname->ns = SVN_DAV_PROP_NS_SVN;
pname->name = (const char *)name + 4;
}
else
{
pname->ns = SVN_DAV_PROP_NS_CUSTOM;
pname->name = name;
}
}
}
static dav_error *dav_svn_db_first_name(dav_db *db, dav_prop_name *pname)
{
/* if we don't have a copy of the properties, then get one */
if (db->props == NULL)
{
svn_error_t *serr;
/* Working Baseline, Baseline, or (Working) Version resource */
if (db->resource->baselined)
{
if (db->resource->type == DAV_RESOURCE_TYPE_WORKING)
serr = svn_fs_txn_proplist(&db->props,
db->resource->info->root.txn,
db->p);
else
serr = svn_repos_fs_revision_proplist
(&db->props,
db->resource->info->repos->repos,
db->resource->info->root.rev,
db->authz_read_func,
db->authz_read_baton,
db->p);
}
else
{
serr = svn_fs_node_proplist(&db->props,
db->resource->info->root.root,
get_repos_path(db->resource->info),
db->p);
}
if (serr != NULL)
return dav_svn_convert_err(serr, HTTP_INTERNAL_SERVER_ERROR,
"could not begin sequencing through "
"properties",
db->resource->pool);
}
/* begin the iteration over the hash */
db->hi = apr_hash_first(db->p, db->props);
/* fetch the first key */
get_name(db, pname);
return NULL;
}
static dav_error *dav_svn_db_next_name(dav_db *db, dav_prop_name *pname)
{
/* skip to the next hash entry */
if (db->hi != NULL)
db->hi = apr_hash_next(db->hi);
/* fetch the key */
get_name(db, pname);
return NULL;
}
static dav_error *dav_svn_db_get_rollback(dav_db *db,
const dav_prop_name *name,
dav_deadprop_rollback **prollback)
{
dav_error *err;
dav_deadprop_rollback *ddp;
svn_string_t *propval;
if ((err = get_value(db, name, &propval)) != NULL)
return err;
ddp = apr_palloc(db->p, sizeof(*ddp));
ddp->name = *name;
ddp->value.data = propval ? propval->data : NULL;
ddp->value.len = propval ? propval->len : 0;
*prollback = ddp;
return NULL;
}
static dav_error *dav_svn_db_apply_rollback(dav_db *db,
dav_deadprop_rollback *rollback)
{
if (rollback->value.data == NULL)
{
return dav_svn_db_remove(db, &rollback->name);
}
return save_value(db, &rollback->name, &rollback->value);
}
const dav_hooks_propdb dav_svn_hooks_propdb = {
dav_svn_db_open,
dav_svn_db_close,
dav_svn_db_define_namespaces,
dav_svn_db_output_value,
dav_svn_db_map_namespaces,
dav_svn_db_store,
dav_svn_db_remove,
dav_svn_db_exists,
dav_svn_db_first_name,
dav_svn_db_next_name,
dav_svn_db_get_rollback,
dav_svn_db_apply_rollback,
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -