blob: 32bb554ba87c6c86f64357a6ae527d2bbf841587 [file] [log] [blame]
/* temp_serializer.h : serialization functions for caching of FSFS structures
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#ifndef SVN_LIBSVN_FS__TEMP_SERIALIZER_H
#define SVN_LIBSVN_FS__TEMP_SERIALIZER_H
#include "fs.h"
/**
* Prepend the @a number to the @a string in a space efficient way such that
* no other (number,string) combination can produce the same result.
* Allocate temporaries as well as the result from @a pool.
*/
const char*
svn_fs_fs__combine_number_and_string(apr_int64_t number,
const char *string,
apr_pool_t *pool);
/**
* Serialize a @a noderev_p within the serialization @a context.
*/
void
svn_fs_fs__noderev_serialize(struct svn_temp_serializer__context_t *context,
node_revision_t * const *noderev_p);
/**
* Deserialize a @a noderev_p within the @a buffer.
*/
void
svn_fs_fs__noderev_deserialize(void *buffer,
node_revision_t **noderev_p);
/**
* Adds position information to the raw window data in WINDOW.
*/
typedef struct svn_fs_fs__raw_cached_window_t
{
/* the (unprocessed) txdelta window byte sequence cached / to be cached */
svn_string_t window;
/* the offset within the representation right after reading the window */
apr_off_t end_offset;
/* svndiff version */
int ver;
} svn_fs_fs__raw_cached_window_t;
/**
* Implements #svn_cache__serialize_func_t for
* #svn_fs_fs__raw_cached_window_t.
*/
svn_error_t *
svn_fs_fs__serialize_raw_window(void **buffer,
apr_size_t *buffer_size,
void *item,
apr_pool_t *pool);
/**
* Implements #svn_cache__deserialize_func_t for
* #svn_fs_fs__raw_cached_window_t.
*/
svn_error_t *
svn_fs_fs__deserialize_raw_window(void **item,
void *buffer,
apr_size_t buffer_size,
apr_pool_t *pool);
/**
* #svn_txdelta_window_t is not sufficient for caching the data it
* represents because data read process needs auxiliary information.
*/
typedef struct svn_fs_fs__txdelta_cached_window_t
{
/* the txdelta window information cached / to be cached */
svn_txdelta_window_t *window;
/* the revision file read pointer position right after reading the window */
apr_off_t end_offset;
} svn_fs_fs__txdelta_cached_window_t;
/**
* Implements #svn_cache__serialize_func_t for
* #svn_fs_fs__txdelta_cached_window_t.
*/
svn_error_t *
svn_fs_fs__serialize_txdelta_window(void **buffer,
apr_size_t *buffer_size,
void *item,
apr_pool_t *pool);
/**
* Implements #svn_cache__deserialize_func_t for
* #svn_fs_fs__txdelta_cached_window_t.
*/
svn_error_t *
svn_fs_fs__deserialize_txdelta_window(void **item,
void *buffer,
apr_size_t buffer_size,
apr_pool_t *pool);
/**
* Implements #svn_cache__serialize_func_t for a manifest
* (@a in is an #apr_array_header_t of apr_off_t elements).
*/
svn_error_t *
svn_fs_fs__serialize_manifest(void **data,
apr_size_t *data_len,
void *in,
apr_pool_t *pool);
/**
* Implements #svn_cache__deserialize_func_t for a manifest
* (@a *out is an #apr_array_header_t of apr_off_t elements).
*/
svn_error_t *
svn_fs_fs__deserialize_manifest(void **out,
void *data,
apr_size_t data_len,
apr_pool_t *pool);
/**
* Implements #svn_cache__serialize_func_t for a properties hash
* (@a in is an #apr_hash_t of svn_string_t elements, keyed by const char*).
*/
svn_error_t *
svn_fs_fs__serialize_properties(void **data,
apr_size_t *data_len,
void *in,
apr_pool_t *pool);
/**
* Implements #svn_cache__deserialize_func_t for a properties hash
* (@a *out is an #apr_hash_t of svn_string_t elements, keyed by const char*).
*/
svn_error_t *
svn_fs_fs__deserialize_properties(void **out,
void *data,
apr_size_t data_len,
apr_pool_t *pool);
/**
* Implements #svn_cache__serialize_func_t for a properties hash
* (@a in is an #apr_hash_t of svn_string_t elements, keyed by const char*).
*/
svn_error_t *
svn_fs_fs__serialize_revprops(void **data,
apr_size_t *data_len,
void *in,
apr_pool_t *pool);
/**
* Implements #svn_cache__deserialize_func_t for a properties hash
* (@a *out is an #apr_hash_t of svn_string_t elements, keyed by const char*).
*/
svn_error_t *
svn_fs_fs__deserialize_revprops(void **out,
void *data,
apr_size_t data_len,
apr_pool_t *pool);
/**
* Implements #svn_cache__serialize_func_t for #svn_fs_id_t
*/
svn_error_t *
svn_fs_fs__serialize_id(void **data,
apr_size_t *data_len,
void *in,
apr_pool_t *pool);
/**
* Implements #svn_cache__deserialize_func_t for #svn_fs_id_t
*/
svn_error_t *
svn_fs_fs__deserialize_id(void **out,
void *data,
apr_size_t data_len,
apr_pool_t *pool);
/**
* Implements #svn_cache__serialize_func_t for #node_revision_t
*/
svn_error_t *
svn_fs_fs__serialize_node_revision(void **buffer,
apr_size_t *buffer_size,
void *item,
apr_pool_t *pool);
/**
* Implements #svn_cache__deserialize_func_t for #node_revision_t
*/
svn_error_t *
svn_fs_fs__deserialize_node_revision(void **item,
void *buffer,
apr_size_t buffer_size,
apr_pool_t *pool);
/**
* Implements #svn_cache__serialize_func_t for a #svn_fs_fs__dir_data_t
*/
svn_error_t *
svn_fs_fs__serialize_dir_entries(void **data,
apr_size_t *data_len,
void *in,
apr_pool_t *pool);
/**
* Same as svn_fs_fs__serialize_dir_entries but allocates extra room for
* in-place modification.
*/
svn_error_t *
svn_fs_fs__serialize_txndir_entries(void **data,
apr_size_t *data_len,
void *in,
apr_pool_t *pool);
/**
* Implements #svn_cache__deserialize_func_t for a #svn_fs_fs__dir_data_t
*/
svn_error_t *
svn_fs_fs__deserialize_dir_entries(void **out,
void *data,
apr_size_t data_len,
apr_pool_t *pool);
/**
* Implements #svn_cache__partial_getter_func_t. Set (apr_off_t) @a *out
* to the element indexed by (apr_int64_t) @a *baton within the
* serialized manifest array @a data and @a data_len. */
svn_error_t *
svn_fs_fs__get_sharded_offset(void **out,
const void *data,
apr_size_t data_len,
void *baton,
apr_pool_t *pool);
/**
* Implements #svn_cache__partial_getter_func_t.
* Set (svn_filesize_t) @a *out to the filesize info stored with the
* serialized directory in @a data of @a data_len. @a baton is unused.
*/
svn_error_t *
svn_fs_fs__extract_dir_filesize(void **out,
const void *data,
apr_size_t data_len,
void *baton,
apr_pool_t *pool);
/**
* Describes the entry to be found in a directory: Identifies the entry
* by @a name and requires the directory file size to be @a filesize.
*/
typedef struct extract_dir_entry_baton_t
{
/** name of the directory entry to return */
const char *name;
/** Current length of the in-txn in-disk representation of the directory.
* SVN_INVALID_FILESIZE if unknown. */
svn_filesize_t txn_filesize;
/** Will be set by the callback. If FALSE, the cached data is out of date.
* We need this indicator because the svn_cache__t interface will always
* report the lookup as a success (FOUND==TRUE) if the generic lookup was
* successful -- regardless of what the entry extraction callback does. */
svn_boolean_t out_of_date;
} extract_dir_entry_baton_t;
/**
* Implements #svn_cache__partial_getter_func_t for a single
* #svn_fs_dirent_t within a serialized directory contents hash,
* identified by its name (in (extract_dir_entry_baton_t *) @a *baton).
* If the filesize specified in the baton does not match the cached
* value for this directory, @a *out will be NULL as well.
*/
svn_error_t *
svn_fs_fs__extract_dir_entry(void **out,
const void *data,
apr_size_t data_len,
void *baton,
apr_pool_t *pool);
/**
* Describes the change to be done to a directory: Set the entry
* identify by @a name to the value @a new_entry. If the latter is
* @c NULL, the entry shall be removed if it exists. Otherwise it
* will be replaced or automatically added, respectively. The
* @a filesize allows readers to identify stale cache data (e.g.
* due to concurrent access to txns); writers use it to update the
* cached file size info.
*/
typedef struct replace_baton_t
{
/** name of the directory entry to modify */
const char *name;
/** directory entry to insert instead */
svn_fs_dirent_t *new_entry;
/** Current length of the in-txn in-disk representation of the directory.
* SVN_INVALID_FILESIZE if unknown. */
svn_filesize_t txn_filesize;
} replace_baton_t;
/**
* Implements #svn_cache__partial_setter_func_t for a single
* #svn_fs_dirent_t within a serialized directory contents hash,
* identified by its name in the #replace_baton_t in @a baton.
*/
svn_error_t *
svn_fs_fs__replace_dir_entry(void **data,
apr_size_t *data_len,
void *baton,
apr_pool_t *pool);
/**
* Implements #svn_cache__partial_setter_func_t for a #svn_fs_fs__dir_data_t
* at @a *data, resetting its txn_filesize field to SVN_INVALID_FILESIZE.
* &a baton should be NULL.
*/
svn_error_t *
svn_fs_fs__reset_txn_filesize(void **data,
apr_size_t *data_len,
void *baton,
apr_pool_t *pool);
/**
* Implements #svn_cache__serialize_func_t for a #svn_fs_fs__rep_header_t.
*/
svn_error_t *
svn_fs_fs__serialize_rep_header(void **data,
apr_size_t *data_len,
void *in,
apr_pool_t *pool);
/**
* Implements #svn_cache__deserialize_func_t for a #svn_fs_fs__rep_header_t.
*/
svn_error_t *
svn_fs_fs__deserialize_rep_header(void **out,
void *data,
apr_size_t data_len,
apr_pool_t *pool);
/*** Block of changes in a changed paths list. */
typedef struct svn_fs_fs__changes_list_t
{
/* Offset of the first element in CHANGES within the changed paths list
on disk. */
apr_off_t start_offset;
/* Offset of the first element behind CHANGES within the changed paths
list on disk. */
apr_off_t end_offset;
/* End of list reached? This may have false negatives in case the number
of elements in the list is a multiple of our block / range size. */
svn_boolean_t eol;
/* Array of #svn_fs_fs__change_t * representing a consecutive sub-range of
elements in a changed paths list. */
/* number of entries in the array */
int count;
/* reference to the changes */
change_t **changes;
} svn_fs_fs__changes_list_t;
/**
* Implements #svn_cache__serialize_func_t for a #svn_fs_fs__changes_list_t.
*/
svn_error_t *
svn_fs_fs__serialize_changes(void **data,
apr_size_t *data_len,
void *in,
apr_pool_t *pool);
/**
* Implements #svn_cache__deserialize_func_t for a #svn_fs_fs__changes_list_t.
*/
svn_error_t *
svn_fs_fs__deserialize_changes(void **out,
void *data,
apr_size_t data_len,
apr_pool_t *pool);
/**
* Implements #svn_cache__serialize_func_t for #svn_mergeinfo_t objects.
*/
svn_error_t *
svn_fs_fs__serialize_mergeinfo(void **data,
apr_size_t *data_len,
void *in,
apr_pool_t *pool);
/**
* Implements #svn_cache__deserialize_func_t for #svn_mergeinfo_t objects.
*/
svn_error_t *
svn_fs_fs__deserialize_mergeinfo(void **out,
void *data,
apr_size_t data_len,
apr_pool_t *pool);
#endif