1251881Speter/*
2251881Speter * fs_loader.h:  Declarations for the FS loader library
3251881Speter *
4251881Speter * ====================================================================
5251881Speter *    Licensed to the Apache Software Foundation (ASF) under one
6251881Speter *    or more contributor license agreements.  See the NOTICE file
7251881Speter *    distributed with this work for additional information
8251881Speter *    regarding copyright ownership.  The ASF licenses this file
9251881Speter *    to you under the Apache License, Version 2.0 (the
10251881Speter *    "License"); you may not use this file except in compliance
11251881Speter *    with the License.  You may obtain a copy of the License at
12251881Speter *
13251881Speter *      http://www.apache.org/licenses/LICENSE-2.0
14251881Speter *
15251881Speter *    Unless required by applicable law or agreed to in writing,
16251881Speter *    software distributed under the License is distributed on an
17251881Speter *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18251881Speter *    KIND, either express or implied.  See the License for the
19251881Speter *    specific language governing permissions and limitations
20251881Speter *    under the License.
21251881Speter * ====================================================================
22251881Speter */
23251881Speter
24251881Speter
25362181Sdim#ifndef LIBSVN_FS_LOADER_H
26362181Sdim#define LIBSVN_FS_LOADER_H
27251881Speter
28251881Speter#include "svn_types.h"
29251881Speter#include "svn_fs.h"
30289180Speter#include "svn_props.h"
31289180Speter#include "private/svn_mutex.h"
32251881Speter
33251881Speter#ifdef __cplusplus
34251881Speterextern "C" {
35251881Speter#endif /* __cplusplus */
36251881Speter
37251881Speter
38251881Speter/* The FS loader library implements the a front end to "filesystem
39251881Speter   abstract providers" (FSAPs), which implement the svn_fs API.
40251881Speter
41251881Speter   The loader library divides up the FS API into several categories:
42251881Speter
43251881Speter     - Top-level functions, which operate on paths to an FS
44251881Speter     - Functions which operate on an FS object
45251881Speter     - Functions which operate on a transaction object
46251881Speter     - Functions which operate on a root object
47251881Speter     - Functions which operate on a history object
48251881Speter     - Functions which operate on a noderev-ID object
49251881Speter
50251881Speter   Some generic fields of the FS, transaction, root, and history
51251881Speter   objects are defined by the loader library; the rest are stored in
52251881Speter   the "fsap_data" field which is defined by the FSAP.  Likewise, some
53251881Speter   of the very simple svn_fs API functions (such as svn_fs_root_fs)
54251881Speter   are defined by the loader library, while the rest are implemented
55251881Speter   through vtable calls defined by the FSAP.
56251881Speter
57251881Speter   If you are considering writing a new database-backed filesystem
58251881Speter   implementation, it may be appropriate to add a second, lower-level
59251881Speter   abstraction to the libsvn_fs_base library which currently
60251881Speter   implements the BDB filesystem type.  Consult the dev list for
61251881Speter   details on the "FSP-level" abstraction concept.
62251881Speter*/
63251881Speter
64251881Speter
65251881Speter
66251881Speter/*** Top-level library vtable type ***/
67251881Speter
68251881Spetertypedef struct fs_library_vtable_t
69251881Speter{
70251881Speter  /* This field should always remain first in the vtable.
71251881Speter     Apart from that, it can be changed however you like, since exact
72251881Speter     version equality is required between loader and module.  This policy
73251881Speter     was weaker during 1.1.x, but only in ways which do not conflict with
74251881Speter     this statement, now that the minor version has increased. */
75251881Speter  const svn_version_t *(*get_version)(void);
76251881Speter
77289180Speter  /* The open_fs/create/open_fs_for_recovery/upgrade_fs functions must
78289180Speter     use the common_pool_lock to serialize the access to the common_pool
79289180Speter     parameter for allocating fs-global objects such as an env cache. */
80289180Speter  svn_error_t *(*create)(svn_fs_t *fs, const char *path,
81289180Speter                         svn_mutex__t *common_pool_lock,
82362181Sdim                         apr_pool_t *scratch_pool,
83251881Speter                         apr_pool_t *common_pool);
84289180Speter  svn_error_t *(*open_fs)(svn_fs_t *fs, const char *path,
85289180Speter                          svn_mutex__t *common_pool_lock,
86362181Sdim                          apr_pool_t *scratch_pool,
87251881Speter                          apr_pool_t *common_pool);
88251881Speter  /* open_for_recovery() is like open(), but used to fill in an fs pointer
89251881Speter     that will be passed to recover().  We assume that the open() method
90251881Speter     might not be immediately appropriate for recovery. */
91251881Speter  svn_error_t *(*open_fs_for_recovery)(svn_fs_t *fs, const char *path,
92289180Speter                                       svn_mutex__t *common_pool_lock,
93251881Speter                                       apr_pool_t *pool,
94251881Speter                                       apr_pool_t *common_pool);
95289180Speter  svn_error_t *(*upgrade_fs)(svn_fs_t *fs,
96289180Speter                             const char *path,
97289180Speter                             svn_fs_upgrade_notify_t notify_func,
98289180Speter                             void *notify_baton,
99289180Speter                             svn_cancel_func_t cancel_func,
100289180Speter                             void *cancel_baton,
101289180Speter                             svn_mutex__t *common_pool_lock,
102289180Speter                             apr_pool_t *scratch_pool,
103251881Speter                             apr_pool_t *common_pool);
104251881Speter  svn_error_t *(*verify_fs)(svn_fs_t *fs, const char *path,
105251881Speter                            svn_revnum_t start,
106251881Speter                            svn_revnum_t end,
107251881Speter                            svn_fs_progress_notify_func_t notify_func,
108251881Speter                            void *notify_baton,
109251881Speter                            svn_cancel_func_t cancel_func,
110251881Speter                            void *cancel_baton,
111289180Speter                            svn_mutex__t *common_pool_lock,
112251881Speter                            apr_pool_t *pool,
113251881Speter                            apr_pool_t *common_pool);
114251881Speter  svn_error_t *(*delete_fs)(const char *path, apr_pool_t *pool);
115289180Speter  svn_error_t *(*hotcopy)(svn_fs_t *src_fs,
116289180Speter                          svn_fs_t *dst_fs,
117289180Speter                          const char *src_path,
118289180Speter                          const char *dst_path,
119289180Speter                          svn_boolean_t clean,
120289180Speter                          svn_boolean_t incremental,
121289180Speter                          svn_fs_hotcopy_notify_t notify_func,
122289180Speter                          void *notify_baton,
123289180Speter                          svn_cancel_func_t cancel_func,
124289180Speter                          void *cancel_baton,
125289180Speter                          svn_mutex__t *common_pool_lock,
126289180Speter                          apr_pool_t *pool,
127289180Speter                          apr_pool_t *common_pool);
128251881Speter  const char *(*get_description)(void);
129251881Speter  svn_error_t *(*recover)(svn_fs_t *fs,
130251881Speter                          svn_cancel_func_t cancel_func, void *cancel_baton,
131251881Speter                          apr_pool_t *pool);
132251881Speter  svn_error_t *(*pack_fs)(svn_fs_t *fs, const char *path,
133251881Speter                          svn_fs_pack_notify_t notify_func, void *notify_baton,
134251881Speter                          svn_cancel_func_t cancel_func, void *cancel_baton,
135289180Speter                          svn_mutex__t *common_pool_lock,
136251881Speter                          apr_pool_t *pool, apr_pool_t *common_pool);
137251881Speter
138251881Speter  /* Provider-specific functions should go here, even if they could go
139251881Speter     in an object vtable, so that they are all kept together. */
140251881Speter  svn_error_t *(*bdb_logfiles)(apr_array_header_t **logfiles,
141251881Speter                               const char *path, svn_boolean_t only_unused,
142251881Speter                               apr_pool_t *pool);
143251881Speter
144251881Speter  /* This is to let the base provider implement the deprecated
145251881Speter     svn_fs_parse_id, which we've decided doesn't belong in the FS
146251881Speter     API.  If we change our minds and decide to add a real
147251881Speter     svn_fs_parse_id variant which takes an FS object, it should go
148251881Speter     into the FS vtable. */
149251881Speter  svn_fs_id_t *(*parse_id)(const char *data, apr_size_t len,
150251881Speter                           apr_pool_t *pool);
151251881Speter  /* Allow an FSAP to call svn_fs_open(), which is in a higher-level library
152251881Speter     (libsvn_fs-1.so) and cannot easily be moved to libsvn_fs_util. */
153251881Speter  svn_error_t *(*set_svn_fs_open)(svn_fs_t *fs,
154251881Speter                                  svn_error_t *(*svn_fs_open_)(svn_fs_t **,
155251881Speter                                                               const char *,
156251881Speter                                                               apr_hash_t *,
157289180Speter                                                               apr_pool_t *,
158251881Speter                                                               apr_pool_t *));
159289180Speter  /* For svn_fs_info_fsfs_dup(). */
160289180Speter  void *(*info_fsap_dup)(const void *fsap_info,
161289180Speter                         apr_pool_t *result_pool);
162362181Sdim
163362181Sdim  svn_error_t *(*ioctl)(svn_fs_ioctl_code_t ctlcode,
164362181Sdim                        void *input, void **output_p,
165362181Sdim                        svn_cancel_func_t cancel_func,
166362181Sdim                        void *cancel_baton,
167362181Sdim                        apr_pool_t *result_pool,
168362181Sdim                        apr_pool_t *scratch_pool);
169251881Speter} fs_library_vtable_t;
170251881Speter
171251881Speter/* This is the type of symbol an FS module defines to fetch the
172251881Speter   library vtable. The LOADER_VERSION parameter must remain first in
173251881Speter   the list, and the function must use the C calling convention on all
174251881Speter   platforms, so that the init functions can safely read the version
175251881Speter   parameter.  The COMMON_POOL parameter must be a pool with a greater
176251881Speter   lifetime than the fs module so that fs global state can be kept
177251881Speter   in it and cleaned up on termination before the fs module is unloaded.
178251881Speter   Calls to these functions are globally serialized so that they have
179251881Speter   exclusive access to the COMMON_POOL parameter.
180251881Speter
181251881Speter   ### need to force this to be __cdecl on Windows... how?? */
182251881Spetertypedef svn_error_t *(*fs_init_func_t)(const svn_version_t *loader_version,
183251881Speter                                       fs_library_vtable_t **vtable,
184251881Speter                                       apr_pool_t* common_pool);
185251881Speter
186251881Speter/* Here are the declarations for the FS module init functions.  If we
187251881Speter   are using DSO loading, they won't actually be linked into
188251881Speter   libsvn_fs.  Note that these private functions have a common_pool
189251881Speter   parameter that may be used for fs module scoped variables such as
190251881Speter   the bdb cache.  This will be the same common_pool that is passed
191251881Speter   to the create and open functions and these init functions (as well
192251881Speter   as the open and create functions) are globally serialized so that
193251881Speter   they have exclusive access to the common_pool. */
194362181Sdim#include "../libsvn_fs_base/fs_init.h"
195362181Sdim#include "../libsvn_fs_fs/fs_init.h"
196362181Sdim#include "../libsvn_fs_x/fs_init.h"
197251881Speter
198251881Speter
199251881Speter
200251881Speter/*** vtable types for the abstract FS objects ***/
201251881Speter
202251881Spetertypedef struct fs_vtable_t
203251881Speter{
204251881Speter  svn_error_t *(*youngest_rev)(svn_revnum_t *youngest_p, svn_fs_t *fs,
205251881Speter                               apr_pool_t *pool);
206362181Sdim  svn_error_t *(*refresh_revprops)(svn_fs_t *fs, apr_pool_t *scratch_pool);
207251881Speter  svn_error_t *(*revision_prop)(svn_string_t **value_p, svn_fs_t *fs,
208251881Speter                                svn_revnum_t rev, const char *propname,
209362181Sdim                                svn_boolean_t refresh,
210362181Sdim                                apr_pool_t *result_pool,
211362181Sdim                                apr_pool_t *scratch_pool);
212251881Speter  svn_error_t *(*revision_proplist)(apr_hash_t **table_p, svn_fs_t *fs,
213362181Sdim                                    svn_revnum_t rev,
214362181Sdim                                    svn_boolean_t refresh,
215362181Sdim                                    apr_pool_t *result_pool,
216362181Sdim                                    apr_pool_t *scratch_pool);
217251881Speter  svn_error_t *(*change_rev_prop)(svn_fs_t *fs, svn_revnum_t rev,
218251881Speter                                  const char *name,
219251881Speter                                  const svn_string_t *const *old_value_p,
220251881Speter                                  const svn_string_t *value,
221251881Speter                                  apr_pool_t *pool);
222251881Speter  /* There is no get_uuid(); see svn_fs_t.uuid docstring. */
223251881Speter  svn_error_t *(*set_uuid)(svn_fs_t *fs, const char *uuid, apr_pool_t *pool);
224251881Speter  svn_error_t *(*revision_root)(svn_fs_root_t **root_p, svn_fs_t *fs,
225251881Speter                                svn_revnum_t rev, apr_pool_t *pool);
226251881Speter  svn_error_t *(*begin_txn)(svn_fs_txn_t **txn_p, svn_fs_t *fs,
227251881Speter                            svn_revnum_t rev, apr_uint32_t flags,
228251881Speter                            apr_pool_t *pool);
229251881Speter  svn_error_t *(*open_txn)(svn_fs_txn_t **txn, svn_fs_t *fs,
230251881Speter                           const char *name, apr_pool_t *pool);
231251881Speter  svn_error_t *(*purge_txn)(svn_fs_t *fs, const char *txn_id,
232251881Speter                            apr_pool_t *pool);
233251881Speter  svn_error_t *(*list_transactions)(apr_array_header_t **names_p,
234251881Speter                                    svn_fs_t *fs, apr_pool_t *pool);
235251881Speter  svn_error_t *(*deltify)(svn_fs_t *fs, svn_revnum_t rev, apr_pool_t *pool);
236289180Speter  svn_error_t *(*lock)(svn_fs_t *fs,
237289180Speter                       apr_hash_t *targets,
238251881Speter                       const char *comment, svn_boolean_t is_dav_comment,
239289180Speter                       apr_time_t expiration_date, svn_boolean_t steal_lock,
240289180Speter                       svn_fs_lock_callback_t lock_callback, void *lock_baton,
241289180Speter                       apr_pool_t *result_pool, apr_pool_t *scratch_pool);
242251881Speter  svn_error_t *(*generate_lock_token)(const char **token, svn_fs_t *fs,
243251881Speter                                      apr_pool_t *pool);
244289180Speter  svn_error_t *(*unlock)(svn_fs_t *fs, apr_hash_t *targets,
245289180Speter                         svn_boolean_t break_lock,
246289180Speter                         svn_fs_lock_callback_t lock_callback, void *lock_baton,
247289180Speter                         apr_pool_t *result_pool, apr_pool_t *scratch_pool);
248251881Speter  svn_error_t *(*get_lock)(svn_lock_t **lock, svn_fs_t *fs,
249251881Speter                           const char *path, apr_pool_t *pool);
250251881Speter  svn_error_t *(*get_locks)(svn_fs_t *fs, const char *path, svn_depth_t depth,
251251881Speter                            svn_fs_get_locks_callback_t get_locks_func,
252251881Speter                            void *get_locks_baton,
253251881Speter                            apr_pool_t *pool);
254289180Speter  svn_error_t *(*info_format)(int *fs_format,
255289180Speter                              svn_version_t **supports_version,
256289180Speter                              svn_fs_t *fs,
257289180Speter                              apr_pool_t *result_pool,
258289180Speter                              apr_pool_t *scratch_pool);
259289180Speter  svn_error_t *(*info_config_files)(apr_array_header_t **files,
260289180Speter                                    svn_fs_t *fs,
261289180Speter                                    apr_pool_t *result_pool,
262289180Speter                                    apr_pool_t *scratch_pool);
263289180Speter  svn_error_t *(*info_fsap)(const void **fsap_info,
264289180Speter                            svn_fs_t *fs,
265289180Speter                            apr_pool_t *result_pool,
266289180Speter                            apr_pool_t *scratch_pool);
267289180Speter  /* info_fsap_dup is in the library vtable. */
268251881Speter  svn_error_t *(*verify_root)(svn_fs_root_t *root,
269251881Speter                              apr_pool_t *pool);
270251881Speter  svn_error_t *(*freeze)(svn_fs_t *fs,
271251881Speter                         svn_fs_freeze_func_t freeze_func,
272251881Speter                         void *freeze_baton, apr_pool_t *pool);
273251881Speter  svn_error_t *(*bdb_set_errcall)(svn_fs_t *fs,
274251881Speter                                  void (*handler)(const char *errpfx,
275251881Speter                                                  char *msg));
276362181Sdim  svn_error_t *(*ioctl)(svn_fs_t *fs, svn_fs_ioctl_code_t ctlcode,
277362181Sdim                        void *input, void **output_p,
278362181Sdim                        svn_cancel_func_t cancel_func,
279362181Sdim                        void *cancel_baton,
280362181Sdim                        apr_pool_t *result_pool,
281362181Sdim                        apr_pool_t *scratch_pool);
282251881Speter} fs_vtable_t;
283251881Speter
284251881Speter
285251881Spetertypedef struct txn_vtable_t
286251881Speter{
287251881Speter  svn_error_t *(*commit)(const char **conflict_p, svn_revnum_t *new_rev,
288251881Speter                         svn_fs_txn_t *txn, apr_pool_t *pool);
289251881Speter  svn_error_t *(*abort)(svn_fs_txn_t *txn, apr_pool_t *pool);
290251881Speter  svn_error_t *(*get_prop)(svn_string_t **value_p, svn_fs_txn_t *txn,
291251881Speter                           const char *propname, apr_pool_t *pool);
292251881Speter  svn_error_t *(*get_proplist)(apr_hash_t **table_p, svn_fs_txn_t *txn,
293251881Speter                               apr_pool_t *pool);
294251881Speter  svn_error_t *(*change_prop)(svn_fs_txn_t *txn, const char *name,
295251881Speter                              const svn_string_t *value, apr_pool_t *pool);
296251881Speter  svn_error_t *(*root)(svn_fs_root_t **root_p, svn_fs_txn_t *txn,
297251881Speter                       apr_pool_t *pool);
298251881Speter  svn_error_t *(*change_props)(svn_fs_txn_t *txn, const apr_array_header_t *props,
299251881Speter                               apr_pool_t *pool);
300251881Speter} txn_vtable_t;
301251881Speter
302251881Speter
303251881Speter/* Some of these operations accept multiple root arguments.  Since the
304251881Speter   roots may not all have the same vtable, we need a rule to determine
305251881Speter   which root's vtable is used.  The rule is: if one of the roots is
306251881Speter   named "target", we use that root's vtable; otherwise, we use the
307251881Speter   first root argument's vtable.
308251881Speter   These callbacks correspond to svn_fs_* functions in include/svn_fs.h,
309251881Speter   see there for details.
310251881Speter   Note: delete_node() corresponds to svn_fs_delete(). */
311251881Spetertypedef struct root_vtable_t
312251881Speter{
313251881Speter  /* Determining what has changed in a root */
314251881Speter  svn_error_t *(*paths_changed)(apr_hash_t **changed_paths_p,
315251881Speter                                svn_fs_root_t *root,
316251881Speter                                apr_pool_t *pool);
317362181Sdim  svn_error_t *(*report_changes)(svn_fs_path_change_iterator_t **iterator,
318362181Sdim                                 svn_fs_root_t *root,
319362181Sdim                                 apr_pool_t *result_pool,
320362181Sdim                                 apr_pool_t *scratch_pool);
321251881Speter
322251881Speter  /* Generic node operations */
323251881Speter  svn_error_t *(*check_path)(svn_node_kind_t *kind_p, svn_fs_root_t *root,
324251881Speter                             const char *path, apr_pool_t *pool);
325251881Speter  svn_error_t *(*node_history)(svn_fs_history_t **history_p,
326251881Speter                               svn_fs_root_t *root, const char *path,
327289180Speter                               apr_pool_t *result_pool,
328289180Speter                               apr_pool_t *scratch_pool);
329251881Speter  svn_error_t *(*node_id)(const svn_fs_id_t **id_p, svn_fs_root_t *root,
330251881Speter                          const char *path, apr_pool_t *pool);
331289180Speter  svn_error_t *(*node_relation)(svn_fs_node_relation_t *relation,
332289180Speter                                svn_fs_root_t *root_a, const char *path_a,
333289180Speter                                svn_fs_root_t *root_b, const char *path_b,
334289180Speter                                apr_pool_t *scratch_pool);
335251881Speter  svn_error_t *(*node_created_rev)(svn_revnum_t *revision,
336251881Speter                                   svn_fs_root_t *root, const char *path,
337251881Speter                                   apr_pool_t *pool);
338251881Speter  svn_error_t *(*node_origin_rev)(svn_revnum_t *revision,
339251881Speter                                  svn_fs_root_t *root, const char *path,
340251881Speter                                  apr_pool_t *pool);
341251881Speter  svn_error_t *(*node_created_path)(const char **created_path,
342251881Speter                                    svn_fs_root_t *root, const char *path,
343251881Speter                                    apr_pool_t *pool);
344251881Speter  svn_error_t *(*delete_node)(svn_fs_root_t *root, const char *path,
345251881Speter                              apr_pool_t *pool);
346289180Speter  svn_error_t *(*copy)(svn_fs_root_t *from_root, const char *from_path,
347289180Speter                       svn_fs_root_t *to_root, const char *to_path,
348289180Speter                       apr_pool_t *pool);
349289180Speter  svn_error_t *(*revision_link)(svn_fs_root_t *from_root,
350289180Speter                                svn_fs_root_t *to_root,
351289180Speter                                const char *path,
352289180Speter                                apr_pool_t *pool);
353251881Speter  svn_error_t *(*copied_from)(svn_revnum_t *rev_p, const char **path_p,
354251881Speter                              svn_fs_root_t *root, const char *path,
355251881Speter                              apr_pool_t *pool);
356251881Speter  svn_error_t *(*closest_copy)(svn_fs_root_t **root_p, const char **path_p,
357251881Speter                               svn_fs_root_t *root, const char *path,
358251881Speter                               apr_pool_t *pool);
359251881Speter
360251881Speter  /* Property operations */
361251881Speter  svn_error_t *(*node_prop)(svn_string_t **value_p, svn_fs_root_t *root,
362251881Speter                            const char *path, const char *propname,
363251881Speter                            apr_pool_t *pool);
364251881Speter  svn_error_t *(*node_proplist)(apr_hash_t **table_p, svn_fs_root_t *root,
365251881Speter                                const char *path, apr_pool_t *pool);
366289180Speter  svn_error_t *(*node_has_props)(svn_boolean_t *has_props, svn_fs_root_t *root,
367289180Speter                                 const char *path, apr_pool_t *scratch_pool);
368251881Speter  svn_error_t *(*change_node_prop)(svn_fs_root_t *root, const char *path,
369251881Speter                                   const char *name,
370251881Speter                                   const svn_string_t *value,
371251881Speter                                   apr_pool_t *pool);
372251881Speter  svn_error_t *(*props_changed)(int *changed_p, svn_fs_root_t *root1,
373251881Speter                                const char *path1, svn_fs_root_t *root2,
374289180Speter                                const char *path2, svn_boolean_t strict,
375289180Speter                                apr_pool_t *scratch_pool);
376251881Speter
377251881Speter  /* Directories */
378251881Speter  svn_error_t *(*dir_entries)(apr_hash_t **entries_p, svn_fs_root_t *root,
379251881Speter                              const char *path, apr_pool_t *pool);
380289180Speter  svn_error_t *(*dir_optimal_order)(apr_array_header_t **ordered_p,
381289180Speter                                    svn_fs_root_t *root,
382289180Speter                                    apr_hash_t *entries,
383289180Speter                                    apr_pool_t *result_pool,
384289180Speter                                    apr_pool_t *scratch_pool);
385251881Speter  svn_error_t *(*make_dir)(svn_fs_root_t *root, const char *path,
386251881Speter                           apr_pool_t *pool);
387251881Speter
388251881Speter  /* Files */
389251881Speter  svn_error_t *(*file_length)(svn_filesize_t *length_p, svn_fs_root_t *root,
390251881Speter                              const char *path, apr_pool_t *pool);
391251881Speter  svn_error_t *(*file_checksum)(svn_checksum_t **checksum,
392251881Speter                                svn_checksum_kind_t kind, svn_fs_root_t *root,
393251881Speter                                const char *path, apr_pool_t *pool);
394251881Speter  svn_error_t *(*file_contents)(svn_stream_t **contents,
395251881Speter                                svn_fs_root_t *root, const char *path,
396251881Speter                                apr_pool_t *pool);
397251881Speter  svn_error_t *(*try_process_file_contents)(svn_boolean_t *success,
398251881Speter                                            svn_fs_root_t *target_root,
399251881Speter                                            const char *target_path,
400251881Speter                                            svn_fs_process_contents_func_t processor,
401251881Speter                                            void* baton,
402251881Speter                                            apr_pool_t *pool);
403251881Speter  svn_error_t *(*make_file)(svn_fs_root_t *root, const char *path,
404251881Speter                            apr_pool_t *pool);
405251881Speter  svn_error_t *(*apply_textdelta)(svn_txdelta_window_handler_t *contents_p,
406251881Speter                                  void **contents_baton_p,
407251881Speter                                  svn_fs_root_t *root, const char *path,
408251881Speter                                  svn_checksum_t *base_checksum,
409251881Speter                                  svn_checksum_t *result_checksum,
410251881Speter                                  apr_pool_t *pool);
411251881Speter  svn_error_t *(*apply_text)(svn_stream_t **contents_p, svn_fs_root_t *root,
412251881Speter                             const char *path, svn_checksum_t *result_checksum,
413251881Speter                             apr_pool_t *pool);
414251881Speter  svn_error_t *(*contents_changed)(int *changed_p, svn_fs_root_t *root1,
415251881Speter                                   const char *path1, svn_fs_root_t *root2,
416289180Speter                                   const char *path2, svn_boolean_t strict,
417289180Speter                                   apr_pool_t *scratch_pool);
418251881Speter  svn_error_t *(*get_file_delta_stream)(svn_txdelta_stream_t **stream_p,
419251881Speter                                        svn_fs_root_t *source_root,
420251881Speter                                        const char *source_path,
421251881Speter                                        svn_fs_root_t *target_root,
422251881Speter                                        const char *target_path,
423251881Speter                                        apr_pool_t *pool);
424251881Speter
425251881Speter  /* Merging. */
426251881Speter  svn_error_t *(*merge)(const char **conflict_p,
427251881Speter                        svn_fs_root_t *source_root,
428251881Speter                        const char *source_path,
429251881Speter                        svn_fs_root_t *target_root,
430251881Speter                        const char *target_path,
431251881Speter                        svn_fs_root_t *ancestor_root,
432251881Speter                        const char *ancestor_path,
433251881Speter                        apr_pool_t *pool);
434251881Speter  /* Mergeinfo. */
435362181Sdim  svn_error_t *(*get_mergeinfo)(svn_fs_root_t *root,
436251881Speter                                const apr_array_header_t *paths,
437251881Speter                                svn_mergeinfo_inheritance_t inherit,
438251881Speter                                svn_boolean_t include_descendants,
439251881Speter                                svn_boolean_t adjust_inherited_mergeinfo,
440362181Sdim                                svn_fs_mergeinfo_receiver_t receiver,
441362181Sdim                                void *baton,
442251881Speter                                apr_pool_t *scratch_pool);
443251881Speter} root_vtable_t;
444251881Speter
445251881Speter
446362181Sdimtypedef struct changes_iterator_vtable_t
447362181Sdim{
448362181Sdim  svn_error_t *(*get)(svn_fs_path_change3_t **change,
449362181Sdim                      svn_fs_path_change_iterator_t *iterator);
450362181Sdim} changes_iterator_vtable_t;
451362181Sdim
452362181Sdim
453251881Spetertypedef struct history_vtable_t
454251881Speter{
455251881Speter  svn_error_t *(*prev)(svn_fs_history_t **prev_history_p,
456251881Speter                       svn_fs_history_t *history, svn_boolean_t cross_copies,
457289180Speter                       apr_pool_t *result_pool, apr_pool_t *scratch_pool);
458251881Speter  svn_error_t *(*location)(const char **path, svn_revnum_t *revision,
459251881Speter                           svn_fs_history_t *history, apr_pool_t *pool);
460251881Speter} history_vtable_t;
461251881Speter
462251881Speter
463251881Spetertypedef struct id_vtable_t
464251881Speter{
465289180Speter  svn_string_t *(*unparse)(const svn_fs_id_t *id,
466289180Speter                           apr_pool_t *pool);
467289180Speter  svn_fs_node_relation_t (*compare)(const svn_fs_id_t *a,
468289180Speter                                    const svn_fs_id_t *b);
469251881Speter} id_vtable_t;
470251881Speter
471251881Speter
472251881Speter
473251881Speter/*** Definitions of the abstract FS object types ***/
474251881Speter
475251881Speter/* These are transaction properties that correspond to the bitfields
476362181Sdim   in the 'flags' argument to svn_fs_begin_txn2().  */
477251881Speter#define SVN_FS__PROP_TXN_CHECK_LOCKS           SVN_PROP_PREFIX "check-locks"
478251881Speter#define SVN_FS__PROP_TXN_CHECK_OOD             SVN_PROP_PREFIX "check-ood"
479289180Speter/* Set to "0" at the start of the txn, to "1" when svn:date changes. */
480289180Speter#define SVN_FS__PROP_TXN_CLIENT_DATE           SVN_PROP_PREFIX "client-date"
481251881Speter
482251881Speterstruct svn_fs_t
483251881Speter{
484251881Speter  /* The pool in which this fs object is allocated */
485251881Speter  apr_pool_t *pool;
486251881Speter
487251881Speter  /* The path to the repository's top-level directory */
488251881Speter  char *path;
489251881Speter
490251881Speter  /* A callback for printing warning messages */
491251881Speter  svn_fs_warning_callback_t warning;
492251881Speter  void *warning_baton;
493251881Speter
494251881Speter  /* The filesystem configuration */
495251881Speter  apr_hash_t *config;
496251881Speter
497251881Speter  /* An access context indicating who's using the fs */
498251881Speter  svn_fs_access_t *access_ctx;
499251881Speter
500251881Speter  /* FSAP-specific vtable and private data */
501362181Sdim  const fs_vtable_t *vtable;
502251881Speter  void *fsap_data;
503251881Speter
504251881Speter  /* UUID, stored by open(), create(), and set_uuid(). */
505251881Speter  const char *uuid;
506251881Speter};
507251881Speter
508251881Speter
509251881Speterstruct svn_fs_txn_t
510251881Speter{
511251881Speter  /* The filesystem to which this transaction belongs */
512251881Speter  svn_fs_t *fs;
513251881Speter
514251881Speter  /* The revision on which this transaction is based, or
515251881Speter     SVN_INVALID_REVISION if the transaction is not based on a
516251881Speter     revision at all */
517251881Speter  svn_revnum_t base_rev;
518251881Speter
519251881Speter  /* The ID of this transaction */
520251881Speter  const char *id;
521251881Speter
522251881Speter  /* FSAP-specific vtable and private data */
523362181Sdim  const txn_vtable_t *vtable;
524251881Speter  void *fsap_data;
525251881Speter};
526251881Speter
527251881Speter
528251881Speterstruct svn_fs_root_t
529251881Speter{
530251881Speter  /* A pool managing this root (and only this root!) */
531251881Speter  apr_pool_t *pool;
532251881Speter
533251881Speter  /* The filesystem to which this root belongs */
534251881Speter  svn_fs_t *fs;
535251881Speter
536251881Speter  /* The kind of root this is */
537251881Speter  svn_boolean_t is_txn_root;
538251881Speter
539251881Speter  /* For transaction roots, the name of the transaction  */
540251881Speter  const char *txn;
541251881Speter
542251881Speter  /* For transaction roots, flags describing the txn's behavior. */
543251881Speter  apr_uint32_t txn_flags;
544251881Speter
545251881Speter  /* For revision roots, the number of the revision; for transaction
546251881Speter     roots, the number of the revision on which the transaction is
547251881Speter     based. */
548251881Speter  svn_revnum_t rev;
549251881Speter
550251881Speter  /* FSAP-specific vtable and private data */
551362181Sdim  const root_vtable_t *vtable;
552251881Speter  void *fsap_data;
553251881Speter};
554251881Speter
555362181Sdimstruct svn_fs_path_change_iterator_t
556362181Sdim{
557362181Sdim  /* FSAP-specific vtable and private data */
558362181Sdim  const changes_iterator_vtable_t *vtable;
559362181Sdim  void *fsap_data;
560362181Sdim};
561251881Speter
562251881Speterstruct svn_fs_history_t
563251881Speter{
564251881Speter  /* FSAP-specific vtable and private data */
565362181Sdim  const history_vtable_t *vtable;
566251881Speter  void *fsap_data;
567251881Speter};
568251881Speter
569251881Speter
570251881Speterstruct svn_fs_id_t
571251881Speter{
572251881Speter  /* FSAP-specific vtable and private data */
573362181Sdim  const id_vtable_t *vtable;
574251881Speter  void *fsap_data;
575251881Speter};
576251881Speter
577251881Speter
578251881Speterstruct svn_fs_access_t
579251881Speter{
580251881Speter  /* An authenticated username using the fs */
581251881Speter  const char *username;
582251881Speter
583251881Speter  /* A collection of lock-tokens supplied by the fs caller.
584289180Speter     Hash maps (const char *) UUID --> path where path can be the
585289180Speter     magic value (void *) 1 if no path was specified.
586251881Speter     fs functions should really only be interested whether a UUID
587251881Speter     exists as a hash key at all;  the value is irrelevant. */
588251881Speter  apr_hash_t *lock_tokens;
589251881Speter};
590251881Speter
591289180Speterstruct svn_fs_lock_target_t
592289180Speter{
593289180Speter  const char *token;
594289180Speter  svn_revnum_t current_rev;
595289180Speter};
596251881Speter
597251881Speter
598251881Speter#ifdef __cplusplus
599251881Speter}
600251881Speter#endif /* __cplusplus */
601251881Speter
602362181Sdim#endif /* LIBSVN_FS_LOADER_H */
603