1251881Speter/* temp_serializer.h : serialization functions for caching of FSFS structures 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__TEMP_SERIALIZER_H 24251881Speter#define SVN_LIBSVN_FS__TEMP_SERIALIZER_H 25251881Speter 26251881Speter#include "fs.h" 27251881Speter 28251881Speter/** 29251881Speter * Prepend the @a number to the @a string in a space efficient way such that 30251881Speter * no other (number,string) combination can produce the same result. 31251881Speter * Allocate temporaries as well as the result from @a pool. 32251881Speter */ 33251881Speterconst char* 34251881Spetersvn_fs_fs__combine_number_and_string(apr_int64_t number, 35251881Speter const char *string, 36251881Speter apr_pool_t *pool); 37251881Speter 38251881Speter/** 39251881Speter * Serialize a @a noderev_p within the serialization @a context. 40251881Speter */ 41251881Spetervoid 42251881Spetersvn_fs_fs__noderev_serialize(struct svn_temp_serializer__context_t *context, 43251881Speter node_revision_t * const *noderev_p); 44251881Speter 45251881Speter/** 46251881Speter * Deserialize a @a noderev_p within the @a buffer. 47251881Speter */ 48251881Spetervoid 49251881Spetersvn_fs_fs__noderev_deserialize(void *buffer, 50251881Speter node_revision_t **noderev_p); 51251881Speter 52289180Speter 53251881Speter/** 54362181Sdim * Adds position information to the raw window data in WINDOW. 55289180Speter */ 56362181Sdimtypedef struct svn_fs_fs__raw_cached_window_t 57289180Speter{ 58289180Speter /* the (unprocessed) txdelta window byte sequence cached / to be cached */ 59289180Speter svn_string_t window; 60289180Speter 61289180Speter /* the offset within the representation right after reading the window */ 62289180Speter apr_off_t end_offset; 63362181Sdim 64362181Sdim /* svndiff version */ 65362181Sdim int ver; 66289180Speter} svn_fs_fs__raw_cached_window_t; 67289180Speter 68289180Speter/** 69289180Speter * Implements #svn_cache__serialize_func_t for 70289180Speter * #svn_fs_fs__raw_cached_window_t. 71289180Speter */ 72289180Spetersvn_error_t * 73289180Spetersvn_fs_fs__serialize_raw_window(void **buffer, 74289180Speter apr_size_t *buffer_size, 75289180Speter void *item, 76289180Speter apr_pool_t *pool); 77289180Speter 78289180Speter/** 79289180Speter * Implements #svn_cache__deserialize_func_t for 80289180Speter * #svn_fs_fs__raw_cached_window_t. 81289180Speter */ 82289180Spetersvn_error_t * 83289180Spetersvn_fs_fs__deserialize_raw_window(void **item, 84289180Speter void *buffer, 85289180Speter apr_size_t buffer_size, 86289180Speter apr_pool_t *pool); 87289180Speter 88289180Speter/** 89251881Speter * #svn_txdelta_window_t is not sufficient for caching the data it 90289180Speter * represents because data read process needs auxiliary information. 91251881Speter */ 92362181Sdimtypedef struct svn_fs_fs__txdelta_cached_window_t 93251881Speter{ 94251881Speter /* the txdelta window information cached / to be cached */ 95251881Speter svn_txdelta_window_t *window; 96251881Speter 97251881Speter /* the revision file read pointer position right after reading the window */ 98251881Speter apr_off_t end_offset; 99251881Speter} svn_fs_fs__txdelta_cached_window_t; 100251881Speter 101251881Speter/** 102251881Speter * Implements #svn_cache__serialize_func_t for 103251881Speter * #svn_fs_fs__txdelta_cached_window_t. 104251881Speter */ 105251881Spetersvn_error_t * 106251881Spetersvn_fs_fs__serialize_txdelta_window(void **buffer, 107251881Speter apr_size_t *buffer_size, 108251881Speter void *item, 109251881Speter apr_pool_t *pool); 110251881Speter 111251881Speter/** 112251881Speter * Implements #svn_cache__deserialize_func_t for 113251881Speter * #svn_fs_fs__txdelta_cached_window_t. 114251881Speter */ 115251881Spetersvn_error_t * 116251881Spetersvn_fs_fs__deserialize_txdelta_window(void **item, 117251881Speter void *buffer, 118251881Speter apr_size_t buffer_size, 119251881Speter apr_pool_t *pool); 120251881Speter 121251881Speter/** 122251881Speter * Implements #svn_cache__serialize_func_t for a manifest 123251881Speter * (@a in is an #apr_array_header_t of apr_off_t elements). 124251881Speter */ 125251881Spetersvn_error_t * 126251881Spetersvn_fs_fs__serialize_manifest(void **data, 127251881Speter apr_size_t *data_len, 128251881Speter void *in, 129251881Speter apr_pool_t *pool); 130251881Speter 131251881Speter/** 132251881Speter * Implements #svn_cache__deserialize_func_t for a manifest 133251881Speter * (@a *out is an #apr_array_header_t of apr_off_t elements). 134251881Speter */ 135251881Spetersvn_error_t * 136251881Spetersvn_fs_fs__deserialize_manifest(void **out, 137251881Speter void *data, 138251881Speter apr_size_t data_len, 139251881Speter apr_pool_t *pool); 140251881Speter 141251881Speter/** 142251881Speter * Implements #svn_cache__serialize_func_t for a properties hash 143251881Speter * (@a in is an #apr_hash_t of svn_string_t elements, keyed by const char*). 144251881Speter */ 145251881Spetersvn_error_t * 146251881Spetersvn_fs_fs__serialize_properties(void **data, 147251881Speter apr_size_t *data_len, 148251881Speter void *in, 149251881Speter apr_pool_t *pool); 150251881Speter 151251881Speter/** 152251881Speter * Implements #svn_cache__deserialize_func_t for a properties hash 153251881Speter * (@a *out is an #apr_hash_t of svn_string_t elements, keyed by const char*). 154251881Speter */ 155251881Spetersvn_error_t * 156251881Spetersvn_fs_fs__deserialize_properties(void **out, 157251881Speter void *data, 158251881Speter apr_size_t data_len, 159251881Speter apr_pool_t *pool); 160251881Speter 161251881Speter/** 162362181Sdim * Implements #svn_cache__serialize_func_t for a properties hash 163362181Sdim * (@a in is an #apr_hash_t of svn_string_t elements, keyed by const char*). 164362181Sdim */ 165362181Sdimsvn_error_t * 166362181Sdimsvn_fs_fs__serialize_revprops(void **data, 167362181Sdim apr_size_t *data_len, 168362181Sdim void *in, 169362181Sdim apr_pool_t *pool); 170362181Sdim 171362181Sdim/** 172362181Sdim * Implements #svn_cache__deserialize_func_t for a properties hash 173362181Sdim * (@a *out is an #apr_hash_t of svn_string_t elements, keyed by const char*). 174362181Sdim */ 175362181Sdimsvn_error_t * 176362181Sdimsvn_fs_fs__deserialize_revprops(void **out, 177362181Sdim void *data, 178362181Sdim apr_size_t data_len, 179362181Sdim apr_pool_t *pool); 180362181Sdim 181362181Sdim/** 182251881Speter * Implements #svn_cache__serialize_func_t for #svn_fs_id_t 183251881Speter */ 184251881Spetersvn_error_t * 185251881Spetersvn_fs_fs__serialize_id(void **data, 186251881Speter apr_size_t *data_len, 187251881Speter void *in, 188251881Speter apr_pool_t *pool); 189251881Speter 190251881Speter/** 191251881Speter * Implements #svn_cache__deserialize_func_t for #svn_fs_id_t 192251881Speter */ 193251881Spetersvn_error_t * 194251881Spetersvn_fs_fs__deserialize_id(void **out, 195251881Speter void *data, 196251881Speter apr_size_t data_len, 197251881Speter apr_pool_t *pool); 198251881Speter 199251881Speter/** 200251881Speter * Implements #svn_cache__serialize_func_t for #node_revision_t 201251881Speter */ 202251881Spetersvn_error_t * 203251881Spetersvn_fs_fs__serialize_node_revision(void **buffer, 204251881Speter apr_size_t *buffer_size, 205251881Speter void *item, 206251881Speter apr_pool_t *pool); 207251881Speter 208251881Speter/** 209251881Speter * Implements #svn_cache__deserialize_func_t for #node_revision_t 210251881Speter */ 211251881Spetersvn_error_t * 212251881Spetersvn_fs_fs__deserialize_node_revision(void **item, 213251881Speter void *buffer, 214251881Speter apr_size_t buffer_size, 215251881Speter apr_pool_t *pool); 216251881Speter 217251881Speter/** 218362181Sdim * Implements #svn_cache__serialize_func_t for a #svn_fs_fs__dir_data_t 219251881Speter */ 220251881Spetersvn_error_t * 221251881Spetersvn_fs_fs__serialize_dir_entries(void **data, 222251881Speter apr_size_t *data_len, 223251881Speter void *in, 224251881Speter apr_pool_t *pool); 225251881Speter 226251881Speter/** 227362181Sdim * Same as svn_fs_fs__serialize_dir_entries but allocates extra room for 228362181Sdim * in-place modification. 229251881Speter */ 230251881Spetersvn_error_t * 231362181Sdimsvn_fs_fs__serialize_txndir_entries(void **data, 232362181Sdim apr_size_t *data_len, 233362181Sdim void *in, 234362181Sdim apr_pool_t *pool); 235362181Sdim 236362181Sdim/** 237362181Sdim * Implements #svn_cache__deserialize_func_t for a #svn_fs_fs__dir_data_t 238362181Sdim */ 239362181Sdimsvn_error_t * 240251881Spetersvn_fs_fs__deserialize_dir_entries(void **out, 241251881Speter void *data, 242251881Speter apr_size_t data_len, 243251881Speter apr_pool_t *pool); 244251881Speter 245251881Speter/** 246251881Speter * Implements #svn_cache__partial_getter_func_t. Set (apr_off_t) @a *out 247251881Speter * to the element indexed by (apr_int64_t) @a *baton within the 248251881Speter * serialized manifest array @a data and @a data_len. */ 249251881Spetersvn_error_t * 250251881Spetersvn_fs_fs__get_sharded_offset(void **out, 251251881Speter const void *data, 252251881Speter apr_size_t data_len, 253251881Speter void *baton, 254251881Speter apr_pool_t *pool); 255251881Speter 256251881Speter/** 257362181Sdim * Implements #svn_cache__partial_getter_func_t. 258362181Sdim * Set (svn_filesize_t) @a *out to the filesize info stored with the 259362181Sdim * serialized directory in @a data of @a data_len. @a baton is unused. 260362181Sdim */ 261362181Sdimsvn_error_t * 262362181Sdimsvn_fs_fs__extract_dir_filesize(void **out, 263362181Sdim const void *data, 264362181Sdim apr_size_t data_len, 265362181Sdim void *baton, 266362181Sdim apr_pool_t *pool); 267362181Sdim 268362181Sdim/** 269362181Sdim * Describes the entry to be found in a directory: Identifies the entry 270362181Sdim * by @a name and requires the directory file size to be @a filesize. 271362181Sdim */ 272362181Sdimtypedef struct extract_dir_entry_baton_t 273362181Sdim{ 274362181Sdim /** name of the directory entry to return */ 275362181Sdim const char *name; 276362181Sdim 277362181Sdim /** Current length of the in-txn in-disk representation of the directory. 278362181Sdim * SVN_INVALID_FILESIZE if unknown. */ 279362181Sdim svn_filesize_t txn_filesize; 280362181Sdim 281362181Sdim /** Will be set by the callback. If FALSE, the cached data is out of date. 282362181Sdim * We need this indicator because the svn_cache__t interface will always 283362181Sdim * report the lookup as a success (FOUND==TRUE) if the generic lookup was 284362181Sdim * successful -- regardless of what the entry extraction callback does. */ 285362181Sdim svn_boolean_t out_of_date; 286362181Sdim} extract_dir_entry_baton_t; 287362181Sdim 288362181Sdim 289362181Sdim/** 290251881Speter * Implements #svn_cache__partial_getter_func_t for a single 291251881Speter * #svn_fs_dirent_t within a serialized directory contents hash, 292362181Sdim * identified by its name (in (extract_dir_entry_baton_t *) @a *baton). 293362181Sdim * If the filesize specified in the baton does not match the cached 294362181Sdim * value for this directory, @a *out will be NULL as well. 295251881Speter */ 296251881Spetersvn_error_t * 297251881Spetersvn_fs_fs__extract_dir_entry(void **out, 298251881Speter const void *data, 299251881Speter apr_size_t data_len, 300251881Speter void *baton, 301251881Speter apr_pool_t *pool); 302251881Speter 303251881Speter/** 304251881Speter * Describes the change to be done to a directory: Set the entry 305251881Speter * identify by @a name to the value @a new_entry. If the latter is 306251881Speter * @c NULL, the entry shall be removed if it exists. Otherwise it 307362181Sdim * will be replaced or automatically added, respectively. The 308362181Sdim * @a filesize allows readers to identify stale cache data (e.g. 309362181Sdim * due to concurrent access to txns); writers use it to update the 310362181Sdim * cached file size info. 311251881Speter */ 312251881Spetertypedef struct replace_baton_t 313251881Speter{ 314251881Speter /** name of the directory entry to modify */ 315251881Speter const char *name; 316251881Speter 317251881Speter /** directory entry to insert instead */ 318251881Speter svn_fs_dirent_t *new_entry; 319362181Sdim 320362181Sdim /** Current length of the in-txn in-disk representation of the directory. 321362181Sdim * SVN_INVALID_FILESIZE if unknown. */ 322362181Sdim svn_filesize_t txn_filesize; 323251881Speter} replace_baton_t; 324251881Speter 325251881Speter/** 326251881Speter * Implements #svn_cache__partial_setter_func_t for a single 327251881Speter * #svn_fs_dirent_t within a serialized directory contents hash, 328251881Speter * identified by its name in the #replace_baton_t in @a baton. 329251881Speter */ 330251881Spetersvn_error_t * 331251881Spetersvn_fs_fs__replace_dir_entry(void **data, 332251881Speter apr_size_t *data_len, 333251881Speter void *baton, 334251881Speter apr_pool_t *pool); 335251881Speter 336251881Speter/** 337362181Sdim * Implements #svn_cache__partial_setter_func_t for a #svn_fs_fs__dir_data_t 338362181Sdim * at @a *data, resetting its txn_filesize field to SVN_INVALID_FILESIZE. 339362181Sdim * &a baton should be NULL. 340362181Sdim */ 341362181Sdimsvn_error_t * 342362181Sdimsvn_fs_fs__reset_txn_filesize(void **data, 343362181Sdim apr_size_t *data_len, 344362181Sdim void *baton, 345362181Sdim apr_pool_t *pool); 346362181Sdim 347362181Sdim/** 348289180Speter * Implements #svn_cache__serialize_func_t for a #svn_fs_fs__rep_header_t. 349289180Speter */ 350289180Spetersvn_error_t * 351289180Spetersvn_fs_fs__serialize_rep_header(void **data, 352289180Speter apr_size_t *data_len, 353289180Speter void *in, 354289180Speter apr_pool_t *pool); 355289180Speter 356289180Speter/** 357289180Speter * Implements #svn_cache__deserialize_func_t for a #svn_fs_fs__rep_header_t. 358289180Speter */ 359289180Spetersvn_error_t * 360289180Spetersvn_fs_fs__deserialize_rep_header(void **out, 361289180Speter void *data, 362289180Speter apr_size_t data_len, 363289180Speter apr_pool_t *pool); 364289180Speter 365362181Sdim/*** Block of changes in a changed paths list. */ 366362181Sdimtypedef struct svn_fs_fs__changes_list_t 367362181Sdim{ 368362181Sdim /* Offset of the first element in CHANGES within the changed paths list 369362181Sdim on disk. */ 370362181Sdim apr_off_t start_offset; 371362181Sdim 372362181Sdim /* Offset of the first element behind CHANGES within the changed paths 373362181Sdim list on disk. */ 374362181Sdim apr_off_t end_offset; 375362181Sdim 376362181Sdim /* End of list reached? This may have false negatives in case the number 377362181Sdim of elements in the list is a multiple of our block / range size. */ 378362181Sdim svn_boolean_t eol; 379362181Sdim 380362181Sdim /* Array of #svn_fs_fs__change_t * representing a consecutive sub-range of 381362181Sdim elements in a changed paths list. */ 382362181Sdim 383362181Sdim /* number of entries in the array */ 384362181Sdim int count; 385362181Sdim 386362181Sdim /* reference to the changes */ 387362181Sdim change_t **changes; 388362181Sdim 389362181Sdim} svn_fs_fs__changes_list_t; 390362181Sdim 391289180Speter/** 392362181Sdim * Implements #svn_cache__serialize_func_t for a #svn_fs_fs__changes_list_t. 393251881Speter */ 394251881Spetersvn_error_t * 395251881Spetersvn_fs_fs__serialize_changes(void **data, 396251881Speter apr_size_t *data_len, 397251881Speter void *in, 398251881Speter apr_pool_t *pool); 399251881Speter 400251881Speter/** 401362181Sdim * Implements #svn_cache__deserialize_func_t for a #svn_fs_fs__changes_list_t. 402251881Speter */ 403251881Spetersvn_error_t * 404251881Spetersvn_fs_fs__deserialize_changes(void **out, 405251881Speter void *data, 406251881Speter apr_size_t data_len, 407251881Speter apr_pool_t *pool); 408251881Speter 409251881Speter/** 410251881Speter * Implements #svn_cache__serialize_func_t for #svn_mergeinfo_t objects. 411251881Speter */ 412251881Spetersvn_error_t * 413251881Spetersvn_fs_fs__serialize_mergeinfo(void **data, 414251881Speter apr_size_t *data_len, 415251881Speter void *in, 416251881Speter apr_pool_t *pool); 417251881Speter 418251881Speter/** 419251881Speter * Implements #svn_cache__deserialize_func_t for #svn_mergeinfo_t objects. 420251881Speter */ 421251881Spetersvn_error_t * 422251881Spetersvn_fs_fs__deserialize_mergeinfo(void **out, 423251881Speter void *data, 424251881Speter apr_size_t data_len, 425251881Speter apr_pool_t *pool); 426251881Speter 427251881Speter#endif 428