1 /* temp_serializer.h : serialization functions for caching of FSFS structures
3 * ====================================================================
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
20 * ====================================================================
23 #ifndef SVN_LIBSVN_FS__TEMP_SERIALIZER_H
24 #define SVN_LIBSVN_FS__TEMP_SERIALIZER_H
29 * Prepend the @a number to the @a string in a space efficient way such that
30 * no other (number,string) combination can produce the same result.
31 * Allocate temporaries as well as the result from @a pool.
34 svn_fs_fs__combine_number_and_string(apr_int64_t number,
39 * Serialize a @a noderev_p within the serialization @a context.
42 svn_fs_fs__noderev_serialize(struct svn_temp_serializer__context_t *context,
43 node_revision_t * const *noderev_p);
46 * Deserialize a @a noderev_p within the @a buffer.
49 svn_fs_fs__noderev_deserialize(void *buffer,
50 node_revision_t **noderev_p);
54 * Adds position information to the raw window data in WINDOW.
58 /* the (unprocessed) txdelta window byte sequence cached / to be cached */
61 /* the offset within the representation right after reading the window */
66 } svn_fs_fs__raw_cached_window_t;
69 * Implements #svn_cache__serialize_func_t for
70 * #svn_fs_fs__raw_cached_window_t.
73 svn_fs_fs__serialize_raw_window(void **buffer,
74 apr_size_t *buffer_size,
79 * Implements #svn_cache__deserialize_func_t for
80 * #svn_fs_fs__raw_cached_window_t.
83 svn_fs_fs__deserialize_raw_window(void **item,
85 apr_size_t buffer_size,
89 * #svn_txdelta_window_t is not sufficient for caching the data it
90 * represents because data read process needs auxiliary information.
94 /* the txdelta window information cached / to be cached */
95 svn_txdelta_window_t *window;
97 /* the revision file read pointer position right after reading the window */
99 } svn_fs_fs__txdelta_cached_window_t;
102 * Implements #svn_cache__serialize_func_t for
103 * #svn_fs_fs__txdelta_cached_window_t.
106 svn_fs_fs__serialize_txdelta_window(void **buffer,
107 apr_size_t *buffer_size,
112 * Implements #svn_cache__deserialize_func_t for
113 * #svn_fs_fs__txdelta_cached_window_t.
116 svn_fs_fs__deserialize_txdelta_window(void **item,
118 apr_size_t buffer_size,
122 * Implements #svn_cache__serialize_func_t for a manifest
123 * (@a in is an #apr_array_header_t of apr_off_t elements).
126 svn_fs_fs__serialize_manifest(void **data,
127 apr_size_t *data_len,
132 * Implements #svn_cache__deserialize_func_t for a manifest
133 * (@a *out is an #apr_array_header_t of apr_off_t elements).
136 svn_fs_fs__deserialize_manifest(void **out,
142 * Implements #svn_cache__serialize_func_t for a properties hash
143 * (@a in is an #apr_hash_t of svn_string_t elements, keyed by const char*).
146 svn_fs_fs__serialize_properties(void **data,
147 apr_size_t *data_len,
152 * Implements #svn_cache__deserialize_func_t for a properties hash
153 * (@a *out is an #apr_hash_t of svn_string_t elements, keyed by const char*).
156 svn_fs_fs__deserialize_properties(void **out,
162 * Implements #svn_cache__serialize_func_t for a properties hash
163 * (@a in is an #apr_hash_t of svn_string_t elements, keyed by const char*).
166 svn_fs_fs__serialize_revprops(void **data,
167 apr_size_t *data_len,
172 * Implements #svn_cache__deserialize_func_t for a properties hash
173 * (@a *out is an #apr_hash_t of svn_string_t elements, keyed by const char*).
176 svn_fs_fs__deserialize_revprops(void **out,
182 * Implements #svn_cache__serialize_func_t for #svn_fs_id_t
185 svn_fs_fs__serialize_id(void **data,
186 apr_size_t *data_len,
191 * Implements #svn_cache__deserialize_func_t for #svn_fs_id_t
194 svn_fs_fs__deserialize_id(void **out,
200 * Implements #svn_cache__serialize_func_t for #node_revision_t
203 svn_fs_fs__serialize_node_revision(void **buffer,
204 apr_size_t *buffer_size,
209 * Implements #svn_cache__deserialize_func_t for #node_revision_t
212 svn_fs_fs__deserialize_node_revision(void **item,
214 apr_size_t buffer_size,
218 * Implements #svn_cache__serialize_func_t for a #svn_fs_fs__dir_data_t
221 svn_fs_fs__serialize_dir_entries(void **data,
222 apr_size_t *data_len,
227 * Same as svn_fs_fs__serialize_dir_entries but allocates extra room for
228 * in-place modification.
231 svn_fs_fs__serialize_txndir_entries(void **data,
232 apr_size_t *data_len,
237 * Implements #svn_cache__deserialize_func_t for a #svn_fs_fs__dir_data_t
240 svn_fs_fs__deserialize_dir_entries(void **out,
246 * Implements #svn_cache__partial_getter_func_t. Set (apr_off_t) @a *out
247 * to the element indexed by (apr_int64_t) @a *baton within the
248 * serialized manifest array @a data and @a data_len. */
250 svn_fs_fs__get_sharded_offset(void **out,
257 * Implements #svn_cache__partial_getter_func_t.
258 * Set (svn_filesize_t) @a *out to the filesize info stored with the
259 * serialized directory in @a data of @a data_len. @a baton is unused.
262 svn_fs_fs__extract_dir_filesize(void **out,
269 * Describes the entry to be found in a directory: Identifies the entry
270 * by @a name and requires the directory file size to be @a filesize.
272 typedef struct extract_dir_entry_baton_t
274 /** name of the directory entry to return */
277 /** Current length of the in-txn in-disk representation of the directory.
278 * SVN_INVALID_FILESIZE if unknown. */
279 svn_filesize_t txn_filesize;
281 /** Will be set by the callback. If FALSE, the cached data is out of date.
282 * We need this indicator because the svn_cache__t interface will always
283 * report the lookup as a success (FOUND==TRUE) if the generic lookup was
284 * successful -- regardless of what the entry extraction callback does. */
285 svn_boolean_t out_of_date;
286 } extract_dir_entry_baton_t;
290 * Implements #svn_cache__partial_getter_func_t for a single
291 * #svn_fs_dirent_t within a serialized directory contents hash,
292 * identified by its name (in (extract_dir_entry_baton_t *) @a *baton).
293 * If the filesize specified in the baton does not match the cached
294 * value for this directory, @a *out will be NULL as well.
297 svn_fs_fs__extract_dir_entry(void **out,
304 * Describes the change to be done to a directory: Set the entry
305 * identify by @a name to the value @a new_entry. If the latter is
306 * @c NULL, the entry shall be removed if it exists. Otherwise it
307 * will be replaced or automatically added, respectively. The
308 * @a filesize allows readers to identify stale cache data (e.g.
309 * due to concurrent access to txns); writers use it to update the
310 * cached file size info.
312 typedef struct replace_baton_t
314 /** name of the directory entry to modify */
317 /** directory entry to insert instead */
318 svn_fs_dirent_t *new_entry;
320 /** Current length of the in-txn in-disk representation of the directory.
321 * SVN_INVALID_FILESIZE if unknown. */
322 svn_filesize_t txn_filesize;
326 * Implements #svn_cache__partial_setter_func_t for a single
327 * #svn_fs_dirent_t within a serialized directory contents hash,
328 * identified by its name in the #replace_baton_t in @a baton.
331 svn_fs_fs__replace_dir_entry(void **data,
332 apr_size_t *data_len,
337 * Implements #svn_cache__partial_setter_func_t for a #svn_fs_fs__dir_data_t
338 * at @a *data, resetting its txn_filesize field to SVN_INVALID_FILESIZE.
339 * &a baton should be NULL.
342 svn_fs_fs__reset_txn_filesize(void **data,
343 apr_size_t *data_len,
348 * Implements #svn_cache__serialize_func_t for a #svn_fs_fs__rep_header_t.
351 svn_fs_fs__serialize_rep_header(void **data,
352 apr_size_t *data_len,
357 * Implements #svn_cache__deserialize_func_t for a #svn_fs_fs__rep_header_t.
360 svn_fs_fs__deserialize_rep_header(void **out,
365 /*** Block of changes in a changed paths list. */
366 typedef struct svn_fs_fs__changes_list_t
368 /* Offset of the first element in CHANGES within the changed paths list
370 apr_off_t start_offset;
372 /* Offset of the first element behind CHANGES within the changed paths
374 apr_off_t end_offset;
376 /* End of list reached? This may have false negatives in case the number
377 of elements in the list is a multiple of our block / range size. */
380 /* Array of #svn_fs_x__change_t * representing a consecutive sub-range of
381 elements in a changed paths list. */
383 /* number of entries in the array */
386 /* reference to the changes */
389 } svn_fs_fs__changes_list_t;
392 * Implements #svn_cache__serialize_func_t for a #svn_fs_fs__changes_list_t.
395 svn_fs_fs__serialize_changes(void **data,
396 apr_size_t *data_len,
401 * Implements #svn_cache__deserialize_func_t for a #svn_fs_fs__changes_list_t.
404 svn_fs_fs__deserialize_changes(void **out,
410 * Implements #svn_cache__serialize_func_t for #svn_mergeinfo_t objects.
413 svn_fs_fs__serialize_mergeinfo(void **data,
414 apr_size_t *data_len,
419 * Implements #svn_cache__deserialize_func_t for #svn_mergeinfo_t objects.
422 svn_fs_fs__deserialize_mergeinfo(void **out,