1/* 2 * fs_loader.h: Declarations for the FS loader library 3 * 4 * ==================================================================== 5 * Licensed to the Apache Software Foundation (ASF) under one 6 * or more contributor license agreements. See the NOTICE file 7 * distributed with this work for additional information 8 * regarding copyright ownership. The ASF licenses this file 9 * to you under the Apache License, Version 2.0 (the 10 * "License"); you may not use this file except in compliance 11 * with the License. You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, 16 * software distributed under the License is distributed on an 17 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 18 * KIND, either express or implied. See the License for the 19 * specific language governing permissions and limitations 20 * under the License. 21 * ==================================================================== 22 */ 23 24 25#ifndef LIBSVN_FS_LOADER_H 26#define LIBSVN_FS_LOADER_H 27 28#include "svn_types.h" 29#include "svn_fs.h" 30#include "svn_props.h" 31#include "private/svn_mutex.h" 32 33#ifdef __cplusplus 34extern "C" { 35#endif /* __cplusplus */ 36 37 38/* The FS loader library implements the a front end to "filesystem 39 abstract providers" (FSAPs), which implement the svn_fs API. 40 41 The loader library divides up the FS API into several categories: 42 43 - Top-level functions, which operate on paths to an FS 44 - Functions which operate on an FS object 45 - Functions which operate on a transaction object 46 - Functions which operate on a root object 47 - Functions which operate on a history object 48 - Functions which operate on a noderev-ID object 49 50 Some generic fields of the FS, transaction, root, and history 51 objects are defined by the loader library; the rest are stored in 52 the "fsap_data" field which is defined by the FSAP. Likewise, some 53 of the very simple svn_fs API functions (such as svn_fs_root_fs) 54 are defined by the loader library, while the rest are implemented 55 through vtable calls defined by the FSAP. 56 57 If you are considering writing a new database-backed filesystem 58 implementation, it may be appropriate to add a second, lower-level 59 abstraction to the libsvn_fs_base library which currently 60 implements the BDB filesystem type. Consult the dev list for 61 details on the "FSP-level" abstraction concept. 62*/ 63 64 65 66/*** Top-level library vtable type ***/ 67 68typedef struct fs_library_vtable_t 69{ 70 /* This field should always remain first in the vtable. 71 Apart from that, it can be changed however you like, since exact 72 version equality is required between loader and module. This policy 73 was weaker during 1.1.x, but only in ways which do not conflict with 74 this statement, now that the minor version has increased. */ 75 const svn_version_t *(*get_version)(void); 76 77 /* The open_fs/create/open_fs_for_recovery/upgrade_fs functions must 78 use the common_pool_lock to serialize the access to the common_pool 79 parameter for allocating fs-global objects such as an env cache. */ 80 svn_error_t *(*create)(svn_fs_t *fs, const char *path, 81 svn_mutex__t *common_pool_lock, 82 apr_pool_t *scratch_pool, 83 apr_pool_t *common_pool); 84 svn_error_t *(*open_fs)(svn_fs_t *fs, const char *path, 85 svn_mutex__t *common_pool_lock, 86 apr_pool_t *scratch_pool, 87 apr_pool_t *common_pool); 88 /* open_for_recovery() is like open(), but used to fill in an fs pointer 89 that will be passed to recover(). We assume that the open() method 90 might not be immediately appropriate for recovery. */ 91 svn_error_t *(*open_fs_for_recovery)(svn_fs_t *fs, const char *path, 92 svn_mutex__t *common_pool_lock, 93 apr_pool_t *pool, 94 apr_pool_t *common_pool); 95 svn_error_t *(*upgrade_fs)(svn_fs_t *fs, 96 const char *path, 97 svn_fs_upgrade_notify_t notify_func, 98 void *notify_baton, 99 svn_cancel_func_t cancel_func, 100 void *cancel_baton, 101 svn_mutex__t *common_pool_lock, 102 apr_pool_t *scratch_pool, 103 apr_pool_t *common_pool); 104 svn_error_t *(*verify_fs)(svn_fs_t *fs, const char *path, 105 svn_revnum_t start, 106 svn_revnum_t end, 107 svn_fs_progress_notify_func_t notify_func, 108 void *notify_baton, 109 svn_cancel_func_t cancel_func, 110 void *cancel_baton, 111 svn_mutex__t *common_pool_lock, 112 apr_pool_t *pool, 113 apr_pool_t *common_pool); 114 svn_error_t *(*delete_fs)(const char *path, apr_pool_t *pool); 115 svn_error_t *(*hotcopy)(svn_fs_t *src_fs, 116 svn_fs_t *dst_fs, 117 const char *src_path, 118 const char *dst_path, 119 svn_boolean_t clean, 120 svn_boolean_t incremental, 121 svn_fs_hotcopy_notify_t notify_func, 122 void *notify_baton, 123 svn_cancel_func_t cancel_func, 124 void *cancel_baton, 125 svn_mutex__t *common_pool_lock, 126 apr_pool_t *pool, 127 apr_pool_t *common_pool); 128 const char *(*get_description)(void); 129 svn_error_t *(*recover)(svn_fs_t *fs, 130 svn_cancel_func_t cancel_func, void *cancel_baton, 131 apr_pool_t *pool); 132 svn_error_t *(*pack_fs)(svn_fs_t *fs, const char *path, 133 svn_fs_pack_notify_t notify_func, void *notify_baton, 134 svn_cancel_func_t cancel_func, void *cancel_baton, 135 svn_mutex__t *common_pool_lock, 136 apr_pool_t *pool, apr_pool_t *common_pool); 137 138 /* Provider-specific functions should go here, even if they could go 139 in an object vtable, so that they are all kept together. */ 140 svn_error_t *(*bdb_logfiles)(apr_array_header_t **logfiles, 141 const char *path, svn_boolean_t only_unused, 142 apr_pool_t *pool); 143 144 /* This is to let the base provider implement the deprecated 145 svn_fs_parse_id, which we've decided doesn't belong in the FS 146 API. If we change our minds and decide to add a real 147 svn_fs_parse_id variant which takes an FS object, it should go 148 into the FS vtable. */ 149 svn_fs_id_t *(*parse_id)(const char *data, apr_size_t len, 150 apr_pool_t *pool); 151 /* Allow an FSAP to call svn_fs_open(), which is in a higher-level library 152 (libsvn_fs-1.so) and cannot easily be moved to libsvn_fs_util. */ 153 svn_error_t *(*set_svn_fs_open)(svn_fs_t *fs, 154 svn_error_t *(*svn_fs_open_)(svn_fs_t **, 155 const char *, 156 apr_hash_t *, 157 apr_pool_t *, 158 apr_pool_t *)); 159 /* For svn_fs_info_fsfs_dup(). */ 160 void *(*info_fsap_dup)(const void *fsap_info, 161 apr_pool_t *result_pool); 162 163 svn_error_t *(*ioctl)(svn_fs_ioctl_code_t ctlcode, 164 void *input, void **output_p, 165 svn_cancel_func_t cancel_func, 166 void *cancel_baton, 167 apr_pool_t *result_pool, 168 apr_pool_t *scratch_pool); 169} fs_library_vtable_t; 170 171/* This is the type of symbol an FS module defines to fetch the 172 library vtable. The LOADER_VERSION parameter must remain first in 173 the list, and the function must use the C calling convention on all 174 platforms, so that the init functions can safely read the version 175 parameter. The COMMON_POOL parameter must be a pool with a greater 176 lifetime than the fs module so that fs global state can be kept 177 in it and cleaned up on termination before the fs module is unloaded. 178 Calls to these functions are globally serialized so that they have 179 exclusive access to the COMMON_POOL parameter. 180 181 ### need to force this to be __cdecl on Windows... how?? */ 182typedef svn_error_t *(*fs_init_func_t)(const svn_version_t *loader_version, 183 fs_library_vtable_t **vtable, 184 apr_pool_t* common_pool); 185 186/* Here are the declarations for the FS module init functions. If we 187 are using DSO loading, they won't actually be linked into 188 libsvn_fs. Note that these private functions have a common_pool 189 parameter that may be used for fs module scoped variables such as 190 the bdb cache. This will be the same common_pool that is passed 191 to the create and open functions and these init functions (as well 192 as the open and create functions) are globally serialized so that 193 they have exclusive access to the common_pool. */ 194#include "../libsvn_fs_base/fs_init.h" 195#include "../libsvn_fs_fs/fs_init.h" 196#include "../libsvn_fs_x/fs_init.h" 197 198 199 200/*** vtable types for the abstract FS objects ***/ 201 202typedef struct fs_vtable_t 203{ 204 svn_error_t *(*youngest_rev)(svn_revnum_t *youngest_p, svn_fs_t *fs, 205 apr_pool_t *pool); 206 svn_error_t *(*refresh_revprops)(svn_fs_t *fs, apr_pool_t *scratch_pool); 207 svn_error_t *(*revision_prop)(svn_string_t **value_p, svn_fs_t *fs, 208 svn_revnum_t rev, const char *propname, 209 svn_boolean_t refresh, 210 apr_pool_t *result_pool, 211 apr_pool_t *scratch_pool); 212 svn_error_t *(*revision_proplist)(apr_hash_t **table_p, svn_fs_t *fs, 213 svn_revnum_t rev, 214 svn_boolean_t refresh, 215 apr_pool_t *result_pool, 216 apr_pool_t *scratch_pool); 217 svn_error_t *(*change_rev_prop)(svn_fs_t *fs, svn_revnum_t rev, 218 const char *name, 219 const svn_string_t *const *old_value_p, 220 const svn_string_t *value, 221 apr_pool_t *pool); 222 /* There is no get_uuid(); see svn_fs_t.uuid docstring. */ 223 svn_error_t *(*set_uuid)(svn_fs_t *fs, const char *uuid, apr_pool_t *pool); 224 svn_error_t *(*revision_root)(svn_fs_root_t **root_p, svn_fs_t *fs, 225 svn_revnum_t rev, apr_pool_t *pool); 226 svn_error_t *(*begin_txn)(svn_fs_txn_t **txn_p, svn_fs_t *fs, 227 svn_revnum_t rev, apr_uint32_t flags, 228 apr_pool_t *pool); 229 svn_error_t *(*open_txn)(svn_fs_txn_t **txn, svn_fs_t *fs, 230 const char *name, apr_pool_t *pool); 231 svn_error_t *(*purge_txn)(svn_fs_t *fs, const char *txn_id, 232 apr_pool_t *pool); 233 svn_error_t *(*list_transactions)(apr_array_header_t **names_p, 234 svn_fs_t *fs, apr_pool_t *pool); 235 svn_error_t *(*deltify)(svn_fs_t *fs, svn_revnum_t rev, apr_pool_t *pool); 236 svn_error_t *(*lock)(svn_fs_t *fs, 237 apr_hash_t *targets, 238 const char *comment, svn_boolean_t is_dav_comment, 239 apr_time_t expiration_date, svn_boolean_t steal_lock, 240 svn_fs_lock_callback_t lock_callback, void *lock_baton, 241 apr_pool_t *result_pool, apr_pool_t *scratch_pool); 242 svn_error_t *(*generate_lock_token)(const char **token, svn_fs_t *fs, 243 apr_pool_t *pool); 244 svn_error_t *(*unlock)(svn_fs_t *fs, apr_hash_t *targets, 245 svn_boolean_t break_lock, 246 svn_fs_lock_callback_t lock_callback, void *lock_baton, 247 apr_pool_t *result_pool, apr_pool_t *scratch_pool); 248 svn_error_t *(*get_lock)(svn_lock_t **lock, svn_fs_t *fs, 249 const char *path, apr_pool_t *pool); 250 svn_error_t *(*get_locks)(svn_fs_t *fs, const char *path, svn_depth_t depth, 251 svn_fs_get_locks_callback_t get_locks_func, 252 void *get_locks_baton, 253 apr_pool_t *pool); 254 svn_error_t *(*info_format)(int *fs_format, 255 svn_version_t **supports_version, 256 svn_fs_t *fs, 257 apr_pool_t *result_pool, 258 apr_pool_t *scratch_pool); 259 svn_error_t *(*info_config_files)(apr_array_header_t **files, 260 svn_fs_t *fs, 261 apr_pool_t *result_pool, 262 apr_pool_t *scratch_pool); 263 svn_error_t *(*info_fsap)(const void **fsap_info, 264 svn_fs_t *fs, 265 apr_pool_t *result_pool, 266 apr_pool_t *scratch_pool); 267 /* info_fsap_dup is in the library vtable. */ 268 svn_error_t *(*verify_root)(svn_fs_root_t *root, 269 apr_pool_t *pool); 270 svn_error_t *(*freeze)(svn_fs_t *fs, 271 svn_fs_freeze_func_t freeze_func, 272 void *freeze_baton, apr_pool_t *pool); 273 svn_error_t *(*bdb_set_errcall)(svn_fs_t *fs, 274 void (*handler)(const char *errpfx, 275 char *msg)); 276 svn_error_t *(*ioctl)(svn_fs_t *fs, svn_fs_ioctl_code_t ctlcode, 277 void *input, void **output_p, 278 svn_cancel_func_t cancel_func, 279 void *cancel_baton, 280 apr_pool_t *result_pool, 281 apr_pool_t *scratch_pool); 282} fs_vtable_t; 283 284 285typedef struct txn_vtable_t 286{ 287 svn_error_t *(*commit)(const char **conflict_p, svn_revnum_t *new_rev, 288 svn_fs_txn_t *txn, apr_pool_t *pool); 289 svn_error_t *(*abort)(svn_fs_txn_t *txn, apr_pool_t *pool); 290 svn_error_t *(*get_prop)(svn_string_t **value_p, svn_fs_txn_t *txn, 291 const char *propname, apr_pool_t *pool); 292 svn_error_t *(*get_proplist)(apr_hash_t **table_p, svn_fs_txn_t *txn, 293 apr_pool_t *pool); 294 svn_error_t *(*change_prop)(svn_fs_txn_t *txn, const char *name, 295 const svn_string_t *value, apr_pool_t *pool); 296 svn_error_t *(*root)(svn_fs_root_t **root_p, svn_fs_txn_t *txn, 297 apr_pool_t *pool); 298 svn_error_t *(*change_props)(svn_fs_txn_t *txn, const apr_array_header_t *props, 299 apr_pool_t *pool); 300} txn_vtable_t; 301 302 303/* Some of these operations accept multiple root arguments. Since the 304 roots may not all have the same vtable, we need a rule to determine 305 which root's vtable is used. The rule is: if one of the roots is 306 named "target", we use that root's vtable; otherwise, we use the 307 first root argument's vtable. 308 These callbacks correspond to svn_fs_* functions in include/svn_fs.h, 309 see there for details. 310 Note: delete_node() corresponds to svn_fs_delete(). */ 311typedef struct root_vtable_t 312{ 313 /* Determining what has changed in a root */ 314 svn_error_t *(*paths_changed)(apr_hash_t **changed_paths_p, 315 svn_fs_root_t *root, 316 apr_pool_t *pool); 317 svn_error_t *(*report_changes)(svn_fs_path_change_iterator_t **iterator, 318 svn_fs_root_t *root, 319 apr_pool_t *result_pool, 320 apr_pool_t *scratch_pool); 321 322 /* Generic node operations */ 323 svn_error_t *(*check_path)(svn_node_kind_t *kind_p, svn_fs_root_t *root, 324 const char *path, apr_pool_t *pool); 325 svn_error_t *(*node_history)(svn_fs_history_t **history_p, 326 svn_fs_root_t *root, const char *path, 327 apr_pool_t *result_pool, 328 apr_pool_t *scratch_pool); 329 svn_error_t *(*node_id)(const svn_fs_id_t **id_p, svn_fs_root_t *root, 330 const char *path, apr_pool_t *pool); 331 svn_error_t *(*node_relation)(svn_fs_node_relation_t *relation, 332 svn_fs_root_t *root_a, const char *path_a, 333 svn_fs_root_t *root_b, const char *path_b, 334 apr_pool_t *scratch_pool); 335 svn_error_t *(*node_created_rev)(svn_revnum_t *revision, 336 svn_fs_root_t *root, const char *path, 337 apr_pool_t *pool); 338 svn_error_t *(*node_origin_rev)(svn_revnum_t *revision, 339 svn_fs_root_t *root, const char *path, 340 apr_pool_t *pool); 341 svn_error_t *(*node_created_path)(const char **created_path, 342 svn_fs_root_t *root, const char *path, 343 apr_pool_t *pool); 344 svn_error_t *(*delete_node)(svn_fs_root_t *root, const char *path, 345 apr_pool_t *pool); 346 svn_error_t *(*copy)(svn_fs_root_t *from_root, const char *from_path, 347 svn_fs_root_t *to_root, const char *to_path, 348 apr_pool_t *pool); 349 svn_error_t *(*revision_link)(svn_fs_root_t *from_root, 350 svn_fs_root_t *to_root, 351 const char *path, 352 apr_pool_t *pool); 353 svn_error_t *(*copied_from)(svn_revnum_t *rev_p, const char **path_p, 354 svn_fs_root_t *root, const char *path, 355 apr_pool_t *pool); 356 svn_error_t *(*closest_copy)(svn_fs_root_t **root_p, const char **path_p, 357 svn_fs_root_t *root, const char *path, 358 apr_pool_t *pool); 359 360 /* Property operations */ 361 svn_error_t *(*node_prop)(svn_string_t **value_p, svn_fs_root_t *root, 362 const char *path, const char *propname, 363 apr_pool_t *pool); 364 svn_error_t *(*node_proplist)(apr_hash_t **table_p, svn_fs_root_t *root, 365 const char *path, apr_pool_t *pool); 366 svn_error_t *(*node_has_props)(svn_boolean_t *has_props, svn_fs_root_t *root, 367 const char *path, apr_pool_t *scratch_pool); 368 svn_error_t *(*change_node_prop)(svn_fs_root_t *root, const char *path, 369 const char *name, 370 const svn_string_t *value, 371 apr_pool_t *pool); 372 svn_error_t *(*props_changed)(int *changed_p, svn_fs_root_t *root1, 373 const char *path1, svn_fs_root_t *root2, 374 const char *path2, svn_boolean_t strict, 375 apr_pool_t *scratch_pool); 376 377 /* Directories */ 378 svn_error_t *(*dir_entries)(apr_hash_t **entries_p, svn_fs_root_t *root, 379 const char *path, apr_pool_t *pool); 380 svn_error_t *(*dir_optimal_order)(apr_array_header_t **ordered_p, 381 svn_fs_root_t *root, 382 apr_hash_t *entries, 383 apr_pool_t *result_pool, 384 apr_pool_t *scratch_pool); 385 svn_error_t *(*make_dir)(svn_fs_root_t *root, const char *path, 386 apr_pool_t *pool); 387 388 /* Files */ 389 svn_error_t *(*file_length)(svn_filesize_t *length_p, svn_fs_root_t *root, 390 const char *path, apr_pool_t *pool); 391 svn_error_t *(*file_checksum)(svn_checksum_t **checksum, 392 svn_checksum_kind_t kind, svn_fs_root_t *root, 393 const char *path, apr_pool_t *pool); 394 svn_error_t *(*file_contents)(svn_stream_t **contents, 395 svn_fs_root_t *root, const char *path, 396 apr_pool_t *pool); 397 svn_error_t *(*try_process_file_contents)(svn_boolean_t *success, 398 svn_fs_root_t *target_root, 399 const char *target_path, 400 svn_fs_process_contents_func_t processor, 401 void* baton, 402 apr_pool_t *pool); 403 svn_error_t *(*make_file)(svn_fs_root_t *root, const char *path, 404 apr_pool_t *pool); 405 svn_error_t *(*apply_textdelta)(svn_txdelta_window_handler_t *contents_p, 406 void **contents_baton_p, 407 svn_fs_root_t *root, const char *path, 408 svn_checksum_t *base_checksum, 409 svn_checksum_t *result_checksum, 410 apr_pool_t *pool); 411 svn_error_t *(*apply_text)(svn_stream_t **contents_p, svn_fs_root_t *root, 412 const char *path, svn_checksum_t *result_checksum, 413 apr_pool_t *pool); 414 svn_error_t *(*contents_changed)(int *changed_p, svn_fs_root_t *root1, 415 const char *path1, svn_fs_root_t *root2, 416 const char *path2, svn_boolean_t strict, 417 apr_pool_t *scratch_pool); 418 svn_error_t *(*get_file_delta_stream)(svn_txdelta_stream_t **stream_p, 419 svn_fs_root_t *source_root, 420 const char *source_path, 421 svn_fs_root_t *target_root, 422 const char *target_path, 423 apr_pool_t *pool); 424 425 /* Merging. */ 426 svn_error_t *(*merge)(const char **conflict_p, 427 svn_fs_root_t *source_root, 428 const char *source_path, 429 svn_fs_root_t *target_root, 430 const char *target_path, 431 svn_fs_root_t *ancestor_root, 432 const char *ancestor_path, 433 apr_pool_t *pool); 434 /* Mergeinfo. */ 435 svn_error_t *(*get_mergeinfo)(svn_fs_root_t *root, 436 const apr_array_header_t *paths, 437 svn_mergeinfo_inheritance_t inherit, 438 svn_boolean_t include_descendants, 439 svn_boolean_t adjust_inherited_mergeinfo, 440 svn_fs_mergeinfo_receiver_t receiver, 441 void *baton, 442 apr_pool_t *scratch_pool); 443} root_vtable_t; 444 445 446typedef struct changes_iterator_vtable_t 447{ 448 svn_error_t *(*get)(svn_fs_path_change3_t **change, 449 svn_fs_path_change_iterator_t *iterator); 450} changes_iterator_vtable_t; 451 452 453typedef struct history_vtable_t 454{ 455 svn_error_t *(*prev)(svn_fs_history_t **prev_history_p, 456 svn_fs_history_t *history, svn_boolean_t cross_copies, 457 apr_pool_t *result_pool, apr_pool_t *scratch_pool); 458 svn_error_t *(*location)(const char **path, svn_revnum_t *revision, 459 svn_fs_history_t *history, apr_pool_t *pool); 460} history_vtable_t; 461 462 463typedef struct id_vtable_t 464{ 465 svn_string_t *(*unparse)(const svn_fs_id_t *id, 466 apr_pool_t *pool); 467 svn_fs_node_relation_t (*compare)(const svn_fs_id_t *a, 468 const svn_fs_id_t *b); 469} id_vtable_t; 470 471 472 473/*** Definitions of the abstract FS object types ***/ 474 475/* These are transaction properties that correspond to the bitfields 476 in the 'flags' argument to svn_fs_begin_txn2(). */ 477#define SVN_FS__PROP_TXN_CHECK_LOCKS SVN_PROP_PREFIX "check-locks" 478#define SVN_FS__PROP_TXN_CHECK_OOD SVN_PROP_PREFIX "check-ood" 479/* Set to "0" at the start of the txn, to "1" when svn:date changes. */ 480#define SVN_FS__PROP_TXN_CLIENT_DATE SVN_PROP_PREFIX "client-date" 481 482struct svn_fs_t 483{ 484 /* The pool in which this fs object is allocated */ 485 apr_pool_t *pool; 486 487 /* The path to the repository's top-level directory */ 488 char *path; 489 490 /* A callback for printing warning messages */ 491 svn_fs_warning_callback_t warning; 492 void *warning_baton; 493 494 /* The filesystem configuration */ 495 apr_hash_t *config; 496 497 /* An access context indicating who's using the fs */ 498 svn_fs_access_t *access_ctx; 499 500 /* FSAP-specific vtable and private data */ 501 const fs_vtable_t *vtable; 502 void *fsap_data; 503 504 /* UUID, stored by open(), create(), and set_uuid(). */ 505 const char *uuid; 506}; 507 508 509struct svn_fs_txn_t 510{ 511 /* The filesystem to which this transaction belongs */ 512 svn_fs_t *fs; 513 514 /* The revision on which this transaction is based, or 515 SVN_INVALID_REVISION if the transaction is not based on a 516 revision at all */ 517 svn_revnum_t base_rev; 518 519 /* The ID of this transaction */ 520 const char *id; 521 522 /* FSAP-specific vtable and private data */ 523 const txn_vtable_t *vtable; 524 void *fsap_data; 525}; 526 527 528struct svn_fs_root_t 529{ 530 /* A pool managing this root (and only this root!) */ 531 apr_pool_t *pool; 532 533 /* The filesystem to which this root belongs */ 534 svn_fs_t *fs; 535 536 /* The kind of root this is */ 537 svn_boolean_t is_txn_root; 538 539 /* For transaction roots, the name of the transaction */ 540 const char *txn; 541 542 /* For transaction roots, flags describing the txn's behavior. */ 543 apr_uint32_t txn_flags; 544 545 /* For revision roots, the number of the revision; for transaction 546 roots, the number of the revision on which the transaction is 547 based. */ 548 svn_revnum_t rev; 549 550 /* FSAP-specific vtable and private data */ 551 const root_vtable_t *vtable; 552 void *fsap_data; 553}; 554 555struct svn_fs_path_change_iterator_t 556{ 557 /* FSAP-specific vtable and private data */ 558 const changes_iterator_vtable_t *vtable; 559 void *fsap_data; 560}; 561 562struct svn_fs_history_t 563{ 564 /* FSAP-specific vtable and private data */ 565 const history_vtable_t *vtable; 566 void *fsap_data; 567}; 568 569 570struct svn_fs_id_t 571{ 572 /* FSAP-specific vtable and private data */ 573 const id_vtable_t *vtable; 574 void *fsap_data; 575}; 576 577 578struct svn_fs_access_t 579{ 580 /* An authenticated username using the fs */ 581 const char *username; 582 583 /* A collection of lock-tokens supplied by the fs caller. 584 Hash maps (const char *) UUID --> path where path can be the 585 magic value (void *) 1 if no path was specified. 586 fs functions should really only be interested whether a UUID 587 exists as a hash key at all; the value is irrelevant. */ 588 apr_hash_t *lock_tokens; 589}; 590 591struct svn_fs_lock_target_t 592{ 593 const char *token; 594 svn_revnum_t current_rev; 595}; 596 597 598#ifdef __cplusplus 599} 600#endif /* __cplusplus */ 601 602#endif /* LIBSVN_FS_LOADER_H */ 603