⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 deadprops.c

📁 linux subdivision ying gai ke yi le ba
💻 C
📖 第 1 页 / 共 2 页
字号:
          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 + -