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