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