1251881Speter/* fs.h : interface to Subversion filesystem, private to libsvn_fs
2251881Speter *
3251881Speter * ====================================================================
4251881Speter *    Licensed to the Apache Software Foundation (ASF) under one
5251881Speter *    or more contributor license agreements.  See the NOTICE file
6251881Speter *    distributed with this work for additional information
7251881Speter *    regarding copyright ownership.  The ASF licenses this file
8251881Speter *    to you under the Apache License, Version 2.0 (the
9251881Speter *    "License"); you may not use this file except in compliance
10251881Speter *    with the License.  You may obtain a copy of the License at
11251881Speter *
12251881Speter *      http://www.apache.org/licenses/LICENSE-2.0
13251881Speter *
14251881Speter *    Unless required by applicable law or agreed to in writing,
15251881Speter *    software distributed under the License is distributed on an
16251881Speter *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17251881Speter *    KIND, either express or implied.  See the License for the
18251881Speter *    specific language governing permissions and limitations
19251881Speter *    under the License.
20251881Speter * ====================================================================
21251881Speter */
22251881Speter
23251881Speter#ifndef SVN_LIBSVN_FS_BASE_H
24251881Speter#define SVN_LIBSVN_FS_BASE_H
25251881Speter
26251881Speter#define SVN_WANT_BDB
27251881Speter#include "svn_private_config.h"
28251881Speter
29251881Speter#include <apr_pools.h>
30251881Speter#include <apr_hash.h>
31251881Speter#include "svn_fs.h"
32251881Speter
33251881Speter#include "bdb/env.h"
34251881Speter
35251881Speter#ifdef __cplusplus
36251881Speterextern "C" {
37251881Speter#endif /* __cplusplus */
38251881Speter
39251881Speter
40251881Speter/*** Filesystem schema versions ***/
41251881Speter
42251881Speter/* The format number of this filesystem.  This is independent of the
43251881Speter   repository format number, and independent of any other FS back
44251881Speter   ends.  See the SVN_FS_BASE__MIN_*_FORMAT defines to get a sense of
45251881Speter   what changes and features were added in which versions of this
46251881Speter   back-end's format.  */
47251881Speter#define SVN_FS_BASE__FORMAT_NUMBER                4
48251881Speter
49251881Speter/* Minimum format number that supports representation sharing.  This
50251881Speter   also brings in the support for storing SHA1 checksums.   */
51251881Speter#define SVN_FS_BASE__MIN_REP_SHARING_FORMAT       4
52251881Speter
53251881Speter/* Minimum format number that supports the 'miscellaneous' table */
54251881Speter#define SVN_FS_BASE__MIN_MISCELLANY_FORMAT        4
55251881Speter
56251881Speter/* Minimum format number that supports forward deltas */
57251881Speter#define SVN_FS_BASE__MIN_FORWARD_DELTAS_FORMAT    4
58251881Speter
59251881Speter/* Minimum format number that supports node-origins tracking */
60251881Speter#define SVN_FS_BASE__MIN_NODE_ORIGINS_FORMAT      3
61251881Speter
62251881Speter/* Minimum format number that supports mergeinfo */
63251881Speter#define SVN_FS_BASE__MIN_MERGEINFO_FORMAT         3
64251881Speter
65251881Speter/* Minimum format number that supports svndiff version 1.  */
66251881Speter#define SVN_FS_BASE__MIN_SVNDIFF1_FORMAT          2
67251881Speter
68251881Speter/* Return SVN_ERR_UNSUPPORTED_FEATURE if the version of filesystem FS does
69251881Speter   not indicate support for FEATURE (which REQUIRES a newer version). */
70251881Spetersvn_error_t *
71251881Spetersvn_fs_base__test_required_feature_format(svn_fs_t *fs,
72251881Speter                                          const char *feature,
73251881Speter                                          int requires);
74251881Speter
75251881Speter
76251881Speter
77251881Speter/*** Miscellany keys. ***/
78251881Speter
79251881Speter/* Revision at which the repo started using forward deltas. */
80251881Speter#define SVN_FS_BASE__MISC_FORWARD_DELTA_UPGRADE  "forward-delta-rev"
81251881Speter
82251881Speter
83251881Speter
84251881Speter/*** The filesystem structure.  ***/
85251881Speter
86251881Spetertypedef struct base_fs_data_t
87251881Speter{
88251881Speter  /* A Berkeley DB environment for all the filesystem's databases.
89251881Speter     This establishes the scope of the filesystem's transactions.  */
90251881Speter  bdb_env_baton_t *bdb;
91251881Speter
92251881Speter  /* The filesystem's various tables.  See `structure' for details.  */
93251881Speter  DB *changes;
94251881Speter  DB *copies;
95251881Speter  DB *nodes;
96251881Speter  DB *representations;
97251881Speter  DB *revisions;
98251881Speter  DB *strings;
99251881Speter  DB *transactions;
100251881Speter  DB *uuids;
101251881Speter  DB *locks;
102251881Speter  DB *lock_tokens;
103251881Speter  DB *node_origins;
104251881Speter  DB *miscellaneous;
105251881Speter  DB *checksum_reps;
106251881Speter
107251881Speter  /* A boolean for tracking when we have a live Berkeley DB
108251881Speter     transaction trail alive. */
109251881Speter  svn_boolean_t in_txn_trail;
110251881Speter
111251881Speter  /* The format number of this FS. */
112251881Speter  int format;
113251881Speter
114251881Speter} base_fs_data_t;
115251881Speter
116251881Speter
117251881Speter/*** Filesystem Revision ***/
118251881Spetertypedef struct revision_t
119251881Speter{
120251881Speter  /* id of the transaction that was committed to create this
121251881Speter     revision. */
122251881Speter  const char *txn_id;
123251881Speter
124251881Speter} revision_t;
125251881Speter
126251881Speter
127251881Speter/*** Transaction Kind ***/
128251881Spetertypedef enum transaction_kind_t
129251881Speter{
130251881Speter  transaction_kind_normal = 1,  /* normal, uncommitted */
131251881Speter  transaction_kind_committed,   /* committed */
132251881Speter  transaction_kind_dead         /* uncommitted and dead */
133251881Speter
134251881Speter} transaction_kind_t;
135251881Speter
136251881Speter
137251881Speter/*** Filesystem Transaction ***/
138251881Spetertypedef struct transaction_t
139251881Speter{
140251881Speter  /* kind of transaction. */
141251881Speter  transaction_kind_t kind;
142251881Speter
143251881Speter  /* revision which this transaction was committed to create, or an
144251881Speter     invalid revision number if this transaction was never committed. */
145251881Speter  svn_revnum_t revision;
146251881Speter
147251881Speter  /* property list (const char * name, svn_string_t * value).
148251881Speter     may be NULL if there are no properties.  */
149251881Speter  apr_hash_t *proplist;
150251881Speter
151251881Speter  /* node revision id of the root node.  */
152251881Speter  const svn_fs_id_t *root_id;
153251881Speter
154251881Speter  /* node revision id of the node which is the root of the revision
155251881Speter     upon which this txn is base.  (unfinished only) */
156251881Speter  const svn_fs_id_t *base_id;
157251881Speter
158251881Speter  /* copies list (const char * copy_ids), or NULL if there have been
159251881Speter     no copies in this transaction.  */
160251881Speter  apr_array_header_t *copies;
161251881Speter
162251881Speter} transaction_t;
163251881Speter
164251881Speter
165251881Speter/*** Node-Revision ***/
166251881Spetertypedef struct node_revision_t
167251881Speter{
168251881Speter  /* node kind */
169251881Speter  svn_node_kind_t kind;
170251881Speter
171251881Speter  /* predecessor node revision id, or NULL if there is no predecessor
172251881Speter     for this node revision */
173251881Speter  const svn_fs_id_t *predecessor_id;
174251881Speter
175251881Speter  /* number of predecessors this node revision has (recursively), or
176251881Speter     -1 if not known (for backward compatibility). */
177251881Speter  int predecessor_count;
178251881Speter
179251881Speter  /* representation key for this node's properties.  may be NULL if
180251881Speter     there are no properties.  */
181251881Speter  const char *prop_key;
182251881Speter
183251881Speter  /* representation key for this node's text data (files) or entries
184251881Speter     list (dirs).  may be NULL if there are no contents.  */
185251881Speter  const char *data_key;
186251881Speter
187251881Speter  /* data representation instance identifier.  Sounds fancy, but is
188251881Speter     really just a way to distinguish between "I use the same rep key
189251881Speter     as another node because we share ancestry and haven't had our
190251881Speter     text touched at all" and "I use the same rep key as another node
191251881Speter     only because one or both of us decided to pick up a shared
192251881Speter     representation after-the-fact."  May be NULL (if this node
193251881Speter     revision isn't using a shared rep, or isn't the original
194251881Speter     "assignee" of a shared rep). */
195251881Speter  const char *data_key_uniquifier;
196251881Speter
197251881Speter  /* representation key for this node's text-data-in-progess (files
198251881Speter     only).  NULL if no edits are currently in-progress.  This field
199251881Speter     is always NULL for kinds other than "file".  */
200251881Speter  const char *edit_key;
201251881Speter
202251881Speter  /* path at which this node first came into existence.  */
203251881Speter  const char *created_path;
204251881Speter
205251881Speter  /* does this node revision have the mergeinfo tracking property set
206251881Speter     on it?  (only valid for FS schema 3 and newer) */
207251881Speter  svn_boolean_t has_mergeinfo;
208251881Speter
209251881Speter  /* number of children of this node which have the mergeinfo tracking
210251881Speter     property set  (0 for files; valid only for FS schema 3 and newer). */
211251881Speter  apr_int64_t mergeinfo_count;
212251881Speter
213251881Speter} node_revision_t;
214251881Speter
215251881Speter
216251881Speter/*** Representation Kind ***/
217251881Spetertypedef enum rep_kind_t
218251881Speter{
219251881Speter  rep_kind_fulltext = 1, /* fulltext */
220251881Speter  rep_kind_delta         /* delta */
221251881Speter
222251881Speter} rep_kind_t;
223251881Speter
224251881Speter
225251881Speter/*** "Delta" Offset/Window Chunk ***/
226251881Spetertypedef struct rep_delta_chunk_t
227251881Speter{
228251881Speter  /* diff format version number ### at this point, "svndiff" is the
229251881Speter     only format used. */
230251881Speter  apr_byte_t version;
231251881Speter
232251881Speter  /* starting offset of the data represented by this chunk */
233251881Speter  svn_filesize_t offset;
234251881Speter
235251881Speter  /* string-key to which this representation points. */
236251881Speter  const char *string_key;
237251881Speter
238251881Speter  /* size of the fulltext data represented by this delta window. */
239251881Speter  apr_size_t size;
240251881Speter
241251881Speter  /* representation-key to use when needed source data for
242251881Speter     undeltification. */
243251881Speter  const char *rep_key;
244251881Speter
245251881Speter  /* apr_off_t rep_offset;  ### not implemented */
246251881Speter
247251881Speter} rep_delta_chunk_t;
248251881Speter
249251881Speter
250251881Speter/*** Representation ***/
251251881Spetertypedef struct representation_t
252251881Speter{
253251881Speter  /* representation kind */
254251881Speter  rep_kind_t kind;
255251881Speter
256251881Speter  /* transaction ID under which representation was created (used as a
257251881Speter     mutability flag when compared with a current editing
258251881Speter     transaction). */
259251881Speter  const char *txn_id;
260251881Speter
261251881Speter  /* Checksums for the contents produced by this representation.
262251881Speter     These checksum is for the contents the rep shows to consumers,
263251881Speter     regardless of how the rep stores the data under the hood.  It is
264251881Speter     independent of the storage (fulltext, delta, whatever).
265251881Speter
266251881Speter     If this is NULL, then for compatibility behave as though
267251881Speter     this checksum matches the expected checksum. */
268251881Speter  svn_checksum_t *md5_checksum;
269251881Speter  svn_checksum_t *sha1_checksum;
270251881Speter
271251881Speter  /* kind-specific stuff */
272251881Speter  union
273251881Speter  {
274251881Speter    /* fulltext stuff */
275251881Speter    struct
276251881Speter    {
277251881Speter      /* string-key which holds the fulltext data */
278251881Speter      const char *string_key;
279251881Speter
280251881Speter    } fulltext;
281251881Speter
282251881Speter    /* delta stuff */
283251881Speter    struct
284251881Speter    {
285251881Speter      /* an array of rep_delta_chunk_t * chunks of delta
286251881Speter         information */
287251881Speter      apr_array_header_t *chunks;
288251881Speter
289251881Speter    } delta;
290251881Speter  } contents;
291251881Speter} representation_t;
292251881Speter
293251881Speter
294251881Speter/*** Copy Kind ***/
295251881Spetertypedef enum copy_kind_t
296251881Speter{
297251881Speter  copy_kind_real = 1, /* real copy */
298251881Speter  copy_kind_soft      /* soft copy */
299251881Speter
300251881Speter} copy_kind_t;
301251881Speter
302251881Speter
303251881Speter/*** Copy ***/
304251881Spetertypedef struct copy_t
305251881Speter{
306251881Speter  /* What kind of copy occurred. */
307251881Speter  copy_kind_t kind;
308251881Speter
309251881Speter  /* Path of copy source. */
310251881Speter  const char *src_path;
311251881Speter
312251881Speter  /* Transaction id of copy source. */
313251881Speter  const char *src_txn_id;
314251881Speter
315251881Speter  /* Node-revision of copy destination. */
316251881Speter  const svn_fs_id_t *dst_noderev_id;
317251881Speter
318251881Speter} copy_t;
319251881Speter
320251881Speter
321251881Speter/*** Change ***/
322251881Spetertypedef struct change_t
323251881Speter{
324251881Speter  /* Path of the change. */
325251881Speter  const char *path;
326251881Speter
327251881Speter  /* Node revision ID of the change. */
328251881Speter  const svn_fs_id_t *noderev_id;
329251881Speter
330251881Speter  /* The kind of change. */
331251881Speter  svn_fs_path_change_kind_t kind;
332251881Speter
333251881Speter  /* Text or property mods? */
334251881Speter  svn_boolean_t text_mod;
335251881Speter  svn_boolean_t prop_mod;
336251881Speter
337251881Speter} change_t;
338251881Speter
339251881Speter
340251881Speter/*** Lock node ***/
341251881Spetertypedef struct lock_node_t
342251881Speter{
343251881Speter  /* entries list, maps (const char *) name --> (const char *) lock-node-id */
344251881Speter  apr_hash_t *entries;
345251881Speter
346251881Speter  /* optional lock-token, might be NULL. */
347251881Speter  const char *lock_token;
348251881Speter
349251881Speter} lock_node_t;
350251881Speter
351251881Speter
352251881Speter
353251881Speter#ifdef __cplusplus
354251881Speter}
355251881Speter#endif /* __cplusplus */
356251881Speter
357251881Speter#endif /* SVN_LIBSVN_FS_BASE_H */
358