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
52251881Speter/**
53251881Speter * #svn_txdelta_window_t is not sufficient for caching the data it
54251881Speter * represents because data read process needs auxilliary information.
55251881Speter */
56251881Spetertypedef struct
57251881Speter{
58251881Speter  /* the txdelta window information cached / to be cached */
59251881Speter  svn_txdelta_window_t *window;
60251881Speter
61251881Speter  /* the revision file read pointer position right after reading the window */
62251881Speter  apr_off_t end_offset;
63251881Speter} svn_fs_fs__txdelta_cached_window_t;
64251881Speter
65251881Speter/**
66251881Speter * Implements #svn_cache__serialize_func_t for
67251881Speter * #svn_fs_fs__txdelta_cached_window_t.
68251881Speter */
69251881Spetersvn_error_t *
70251881Spetersvn_fs_fs__serialize_txdelta_window(void **buffer,
71251881Speter                                    apr_size_t *buffer_size,
72251881Speter                                    void *item,
73251881Speter                                    apr_pool_t *pool);
74251881Speter
75251881Speter/**
76251881Speter * Implements #svn_cache__deserialize_func_t for
77251881Speter * #svn_fs_fs__txdelta_cached_window_t.
78251881Speter */
79251881Spetersvn_error_t *
80251881Spetersvn_fs_fs__deserialize_txdelta_window(void **item,
81251881Speter                                      void *buffer,
82251881Speter                                      apr_size_t buffer_size,
83251881Speter                                      apr_pool_t *pool);
84251881Speter
85251881Speter/**
86251881Speter * Implements #svn_cache__serialize_func_t for a manifest
87251881Speter * (@a in is an #apr_array_header_t of apr_off_t elements).
88251881Speter */
89251881Spetersvn_error_t *
90251881Spetersvn_fs_fs__serialize_manifest(void **data,
91251881Speter                              apr_size_t *data_len,
92251881Speter                              void *in,
93251881Speter                              apr_pool_t *pool);
94251881Speter
95251881Speter/**
96251881Speter * Implements #svn_cache__deserialize_func_t for a manifest
97251881Speter * (@a *out is an #apr_array_header_t of apr_off_t elements).
98251881Speter */
99251881Spetersvn_error_t *
100251881Spetersvn_fs_fs__deserialize_manifest(void **out,
101251881Speter                                void *data,
102251881Speter                                apr_size_t data_len,
103251881Speter                                apr_pool_t *pool);
104251881Speter
105251881Speter/**
106251881Speter * Implements #svn_cache__serialize_func_t for a properties hash
107251881Speter * (@a in is an #apr_hash_t of svn_string_t elements, keyed by const char*).
108251881Speter */
109251881Spetersvn_error_t *
110251881Spetersvn_fs_fs__serialize_properties(void **data,
111251881Speter                                apr_size_t *data_len,
112251881Speter                                void *in,
113251881Speter                                apr_pool_t *pool);
114251881Speter
115251881Speter/**
116251881Speter * Implements #svn_cache__deserialize_func_t for a properties hash
117251881Speter * (@a *out is an #apr_hash_t of svn_string_t elements, keyed by const char*).
118251881Speter */
119251881Spetersvn_error_t *
120251881Spetersvn_fs_fs__deserialize_properties(void **out,
121251881Speter                                  void *data,
122251881Speter                                  apr_size_t data_len,
123251881Speter                                  apr_pool_t *pool);
124251881Speter
125251881Speter/**
126251881Speter * Implements #svn_cache__serialize_func_t for #svn_fs_id_t
127251881Speter */
128251881Spetersvn_error_t *
129251881Spetersvn_fs_fs__serialize_id(void **data,
130251881Speter                        apr_size_t *data_len,
131251881Speter                        void *in,
132251881Speter                        apr_pool_t *pool);
133251881Speter
134251881Speter/**
135251881Speter * Implements #svn_cache__deserialize_func_t for #svn_fs_id_t
136251881Speter */
137251881Spetersvn_error_t *
138251881Spetersvn_fs_fs__deserialize_id(void **out,
139251881Speter                          void *data,
140251881Speter                          apr_size_t data_len,
141251881Speter                          apr_pool_t *pool);
142251881Speter
143251881Speter/**
144251881Speter * Implements #svn_cache__serialize_func_t for #node_revision_t
145251881Speter */
146251881Spetersvn_error_t *
147251881Spetersvn_fs_fs__serialize_node_revision(void **buffer,
148251881Speter                                   apr_size_t *buffer_size,
149251881Speter                                   void *item,
150251881Speter                                   apr_pool_t *pool);
151251881Speter
152251881Speter/**
153251881Speter * Implements #svn_cache__deserialize_func_t for #node_revision_t
154251881Speter */
155251881Spetersvn_error_t *
156251881Spetersvn_fs_fs__deserialize_node_revision(void **item,
157251881Speter                                     void *buffer,
158251881Speter                                     apr_size_t buffer_size,
159251881Speter                                     apr_pool_t *pool);
160251881Speter
161251881Speter/**
162251881Speter * Implements #svn_cache__serialize_func_t for a directory contents hash
163251881Speter */
164251881Spetersvn_error_t *
165251881Spetersvn_fs_fs__serialize_dir_entries(void **data,
166251881Speter                                 apr_size_t *data_len,
167251881Speter                                 void *in,
168251881Speter                                 apr_pool_t *pool);
169251881Speter
170251881Speter/**
171251881Speter * Implements #svn_cache__deserialize_func_t for a directory contents hash
172251881Speter */
173251881Spetersvn_error_t *
174251881Spetersvn_fs_fs__deserialize_dir_entries(void **out,
175251881Speter                                   void *data,
176251881Speter                                   apr_size_t data_len,
177251881Speter                                   apr_pool_t *pool);
178251881Speter
179251881Speter/**
180251881Speter * Implements #svn_cache__partial_getter_func_t.  Set (apr_off_t) @a *out
181251881Speter * to the element indexed by (apr_int64_t) @a *baton within the
182251881Speter * serialized manifest array @a data and @a data_len. */
183251881Spetersvn_error_t *
184251881Spetersvn_fs_fs__get_sharded_offset(void **out,
185251881Speter                              const void *data,
186251881Speter                              apr_size_t data_len,
187251881Speter                              void *baton,
188251881Speter                              apr_pool_t *pool);
189251881Speter
190251881Speter/**
191251881Speter * Implements #svn_cache__partial_getter_func_t for a single
192251881Speter * #svn_fs_dirent_t within a serialized directory contents hash,
193251881Speter * identified by its name (const char @a *baton).
194251881Speter */
195251881Spetersvn_error_t *
196251881Spetersvn_fs_fs__extract_dir_entry(void **out,
197251881Speter                             const void *data,
198251881Speter                             apr_size_t data_len,
199251881Speter                             void *baton,
200251881Speter                             apr_pool_t *pool);
201251881Speter
202251881Speter/**
203251881Speter * Describes the change to be done to a directory: Set the entry
204251881Speter * identify by @a name to the value @a new_entry. If the latter is
205251881Speter * @c NULL, the entry shall be removed if it exists. Otherwise it
206251881Speter * will be replaced or automatically added, respectively.
207251881Speter */
208251881Spetertypedef struct replace_baton_t
209251881Speter{
210251881Speter  /** name of the directory entry to modify */
211251881Speter  const char *name;
212251881Speter
213251881Speter  /** directory entry to insert instead */
214251881Speter  svn_fs_dirent_t *new_entry;
215251881Speter} replace_baton_t;
216251881Speter
217251881Speter/**
218251881Speter * Implements #svn_cache__partial_setter_func_t for a single
219251881Speter * #svn_fs_dirent_t within a serialized directory contents hash,
220251881Speter * identified by its name in the #replace_baton_t in @a baton.
221251881Speter */
222251881Spetersvn_error_t *
223251881Spetersvn_fs_fs__replace_dir_entry(void **data,
224251881Speter                             apr_size_t *data_len,
225251881Speter                             void *baton,
226251881Speter                             apr_pool_t *pool);
227251881Speter
228251881Speter/**
229251881Speter * Implements #svn_cache__serialize_func_t for an #apr_array_header_t of
230251881Speter * #change_t *.
231251881Speter */
232251881Spetersvn_error_t *
233251881Spetersvn_fs_fs__serialize_changes(void **data,
234251881Speter                             apr_size_t *data_len,
235251881Speter                             void *in,
236251881Speter                             apr_pool_t *pool);
237251881Speter
238251881Speter/**
239251881Speter * Implements #svn_cache__deserialize_func_t for an #apr_array_header_t of
240251881Speter * #change_t *.
241251881Speter */
242251881Spetersvn_error_t *
243251881Spetersvn_fs_fs__deserialize_changes(void **out,
244251881Speter                               void *data,
245251881Speter                               apr_size_t data_len,
246251881Speter                               apr_pool_t *pool);
247251881Speter
248251881Speter/**
249251881Speter * Implements #svn_cache__serialize_func_t for #svn_mergeinfo_t objects.
250251881Speter */
251251881Spetersvn_error_t *
252251881Spetersvn_fs_fs__serialize_mergeinfo(void **data,
253251881Speter                               apr_size_t *data_len,
254251881Speter                               void *in,
255251881Speter                               apr_pool_t *pool);
256251881Speter
257251881Speter/**
258251881Speter * Implements #svn_cache__deserialize_func_t for #svn_mergeinfo_t objects.
259251881Speter */
260251881Spetersvn_error_t *
261251881Spetersvn_fs_fs__deserialize_mergeinfo(void **out,
262251881Speter                                 void *data,
263251881Speter                                 apr_size_t data_len,
264251881Speter                                 apr_pool_t *pool);
265251881Speter
266251881Speter#endif
267