1 /* dbt.c --- DBT-frobbing functions
3 * ====================================================================
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
20 * ====================================================================
25 #include <apr_pools.h>
30 #include "svn_private_config.h"
37 svn_fs_base__clear_dbt(DBT *dbt)
39 memset(dbt, 0, sizeof(*dbt));
45 DBT *svn_fs_base__nodata_dbt(DBT *dbt)
47 svn_fs_base__clear_dbt(dbt);
49 /* A `nodata' dbt is one which retrieves zero bytes from offset zero,
50 and stores them in a zero-byte buffer in user-allocated memory. */
51 dbt->flags |= (DB_DBT_USERMEM | DB_DBT_PARTIAL);
52 dbt->doff = dbt->dlen = 0;
59 svn_fs_base__set_dbt(DBT *dbt, const void *data, apr_size_t size)
61 svn_fs_base__clear_dbt(dbt);
63 dbt->data = (void *) data;
64 dbt->size = (u_int32_t) size;
71 svn_fs_base__result_dbt(DBT *dbt)
73 svn_fs_base__clear_dbt(dbt);
74 dbt->flags |= DB_DBT_MALLOC;
80 /* An APR pool cleanup function that simply applies `free' to its
83 apr_free_cleanup(void *arg)
92 svn_fs_base__track_dbt(DBT *dbt, apr_pool_t *pool)
95 apr_pool_cleanup_register(pool, dbt->data, apr_free_cleanup,
96 apr_pool_cleanup_null);
103 svn_fs_base__recno_dbt(DBT *dbt, db_recno_t *recno)
105 svn_fs_base__set_dbt(dbt, recno, sizeof(*recno));
106 dbt->ulen = dbt->size;
107 dbt->flags |= DB_DBT_USERMEM;
114 svn_fs_base__compare_dbt(const DBT *a, const DBT *b)
116 int common_size = a->size > b->size ? b->size : a->size;
117 int cmp = memcmp(a->data, b->data, common_size);
122 return a->size - b->size;
127 /* Building DBT's from interesting things. */
130 /* Set DBT to the unparsed form of ID; allocate memory from POOL.
133 svn_fs_base__id_to_dbt(DBT *dbt,
134 const svn_fs_id_t *id,
137 svn_string_t *unparsed_id = svn_fs_base__id_unparse(id, pool);
138 svn_fs_base__set_dbt(dbt, unparsed_id->data, unparsed_id->len);
143 /* Set DBT to the unparsed form of SKEL; allocate memory from POOL. */
145 svn_fs_base__skel_to_dbt(DBT *dbt,
149 svn_stringbuf_t *unparsed_skel = svn_skel__unparse(skel, pool);
150 svn_fs_base__set_dbt(dbt, unparsed_skel->data, unparsed_skel->len);
155 /* Set DBT to the text of the null-terminated string STR. DBT will
156 refer to STR's storage. Return DBT. */
158 svn_fs_base__str_to_dbt(DBT *dbt, const char *str)
160 svn_fs_base__set_dbt(dbt, str, strlen(str));
165 svn_fs_base__checksum_to_dbt(DBT *dbt, svn_checksum_t *checksum)
167 svn_fs_base__set_dbt(dbt, checksum->digest, svn_checksum_size(checksum));