1/* dbt.c --- DBT-frobbing functions
2 *
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
11 *
12 *      http://www.apache.org/licenses/LICENSE-2.0
13 *
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
19 *    under the License.
20 * ====================================================================
21 */
22
23#include <stdlib.h>
24#include <string.h>
25#include <apr_pools.h>
26#include <apr_md5.h>
27#include <apr_sha1.h>
28
29#define SVN_WANT_BDB
30#include "svn_private_config.h"
31
32#include "../id.h"
33#include "dbt.h"
34
35
36DBT *
37svn_fs_base__clear_dbt(DBT *dbt)
38{
39  memset(dbt, 0, sizeof(*dbt));
40
41  return dbt;
42}
43
44
45DBT *svn_fs_base__nodata_dbt(DBT *dbt)
46{
47  svn_fs_base__clear_dbt(dbt);
48
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;
53
54  return dbt;
55}
56
57
58DBT *
59svn_fs_base__set_dbt(DBT *dbt, const void *data, apr_size_t size)
60{
61  svn_fs_base__clear_dbt(dbt);
62
63  dbt->data = (void *) data;
64  dbt->size = (u_int32_t) size;
65
66  return dbt;
67}
68
69
70DBT *
71svn_fs_base__result_dbt(DBT *dbt)
72{
73  svn_fs_base__clear_dbt(dbt);
74  dbt->flags |= DB_DBT_MALLOC;
75
76  return dbt;
77}
78
79
80/* An APR pool cleanup function that simply applies `free' to its
81   argument.  */
82static apr_status_t
83apr_free_cleanup(void *arg)
84{
85  free(arg);
86
87  return 0;
88}
89
90
91DBT *
92svn_fs_base__track_dbt(DBT *dbt, apr_pool_t *pool)
93{
94  if (dbt->data)
95    apr_pool_cleanup_register(pool, dbt->data, apr_free_cleanup,
96                              apr_pool_cleanup_null);
97
98  return dbt;
99}
100
101
102DBT *
103svn_fs_base__recno_dbt(DBT *dbt, db_recno_t *recno)
104{
105  svn_fs_base__set_dbt(dbt, recno, sizeof(*recno));
106  dbt->ulen = dbt->size;
107  dbt->flags |= DB_DBT_USERMEM;
108
109  return dbt;
110}
111
112
113int
114svn_fs_base__compare_dbt(const DBT *a, const DBT *b)
115{
116  int common_size = a->size > b->size ? b->size : a->size;
117  int cmp = memcmp(a->data, b->data, common_size);
118
119  if (cmp)
120    return cmp;
121  else
122    return a->size - b->size;
123}
124
125
126
127/* Building DBT's from interesting things.  */
128
129
130/* Set DBT to the unparsed form of ID; allocate memory from POOL.
131   Return DBT.  */
132DBT *
133svn_fs_base__id_to_dbt(DBT *dbt,
134                       const svn_fs_id_t *id,
135                       apr_pool_t *pool)
136{
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);
139  return dbt;
140}
141
142
143/* Set DBT to the unparsed form of SKEL; allocate memory from POOL.  */
144DBT *
145svn_fs_base__skel_to_dbt(DBT *dbt,
146                         svn_skel_t *skel,
147                         apr_pool_t *pool)
148{
149  svn_stringbuf_t *unparsed_skel = svn_skel__unparse(skel, pool);
150  svn_fs_base__set_dbt(dbt, unparsed_skel->data, unparsed_skel->len);
151  return dbt;
152}
153
154
155/* Set DBT to the text of the null-terminated string STR.  DBT will
156   refer to STR's storage.  Return DBT.  */
157DBT *
158svn_fs_base__str_to_dbt(DBT *dbt, const char *str)
159{
160  svn_fs_base__set_dbt(dbt, str, strlen(str));
161  return dbt;
162}
163
164DBT *
165svn_fs_base__checksum_to_dbt(DBT *dbt, svn_checksum_t *checksum)
166{
167  svn_fs_base__set_dbt(dbt, checksum->digest, svn_checksum_size(checksum));
168
169  return dbt;
170}
171