1289177Speter/* reps.h --- FSX representation container 2289177Speter * 3289177Speter * ==================================================================== 4289177Speter * Licensed to the Apache Software Foundation (ASF) under one 5289177Speter * or more contributor license agreements. See the NOTICE file 6289177Speter * distributed with this work for additional information 7289177Speter * regarding copyright ownership. The ASF licenses this file 8289177Speter * to you under the Apache License, Version 2.0 (the 9289177Speter * "License"); you may not use this file except in compliance 10289177Speter * with the License. You may obtain a copy of the License at 11289177Speter * 12289177Speter * http://www.apache.org/licenses/LICENSE-2.0 13289177Speter * 14289177Speter * Unless required by applicable law or agreed to in writing, 15289177Speter * software distributed under the License is distributed on an 16289177Speter * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17289177Speter * KIND, either express or implied. See the License for the 18289177Speter * specific language governing permissions and limitations 19289177Speter * under the License. 20289177Speter * ==================================================================== 21289177Speter */ 22289177Speter 23289177Speter#ifndef SVN_LIBSVN_FS__REPS_H 24289177Speter#define SVN_LIBSVN_FS__REPS_H 25289177Speter 26289177Speter#include "svn_io.h" 27289177Speter#include "fs.h" 28289177Speter 29289177Speter/* This container type implements the start-delta (aka pick lists) data 30289177Speter * structure plus functions to create it and read data from it. The key 31289177Speter * point is to identify common sub-strings within a whole set of fulltexts 32289177Speter * instead of only two as in the classic txdelta code. 33289177Speter * 34289177Speter * Because it is relatively expensive to optimize the final in-memory 35289177Speter * layout, representation containers cannot be updated. A builder object 36289177Speter * will do most of the space saving when adding fulltexts but the final 37289177Speter * data will only be created immediately before serializing everything to 38289177Speter * disk. So, builders are write only and representation containers are 39289177Speter * read-only. 40289177Speter * 41289177Speter * Extracting data from a representation container is O(length) but it 42289177Speter * may require multiple iterations if base representations outside the 43289177Speter * container were used. Therefore, you will first create an extractor 44289177Speter * object (this may happen while holding a cache lock) and the you need 45289177Speter * to "drive" the extractor outside any cache context. 46289177Speter */ 47289177Speter 48289177Speter/* A write-only constructor object for representation containers. 49289177Speter */ 50289177Spetertypedef struct svn_fs_x__reps_builder_t svn_fs_x__reps_builder_t; 51289177Speter 52289177Speter/* A read-only representation container - 53289177Speter * an opaque collection of fulltexts, i.e. byte strings. 54289177Speter */ 55289177Spetertypedef struct svn_fs_x__reps_t svn_fs_x__reps_t; 56289177Speter 57289177Speter/* The fulltext extractor utility object. 58289177Speter */ 59289177Spetertypedef struct svn_fs_x__rep_extractor_t svn_fs_x__rep_extractor_t; 60289177Speter 61289177Speter/* Baton type to be passed to svn_fs_x__reps_get_func. 62289177Speter */ 63289177Spetertypedef struct svn_fs_x__reps_baton_t 64289177Speter{ 65289177Speter /* filesystem the resulting extractor shall operate on */ 66289177Speter svn_fs_t *fs; 67289177Speter 68289177Speter /* element index of the item to extract from the container */ 69289177Speter apr_size_t idx; 70289177Speter} svn_fs_x__reps_baton_t; 71289177Speter 72289177Speter/* Create and populate noderev containers. */ 73289177Speter 74289177Speter/* Create and return a new builder object, allocated in RESULT_POOL. 75289177Speter */ 76289177Spetersvn_fs_x__reps_builder_t * 77289177Spetersvn_fs_x__reps_builder_create(svn_fs_t *fs, 78289177Speter apr_pool_t *result_pool); 79289177Speter 80289177Speter/* To BUILDER, add reference to the fulltext currently stored in 81289177Speter * representation REP. Substrings matching with any of the base reps 82289177Speter * in BUILDER can be removed from the text base and be replaced by 83289177Speter * references to those base representations. 84289177Speter * 85289177Speter * The PRIORITY is a mere hint on which base representations should 86289177Speter * preferred in case we could re-use the same contents from multiple bases. 87289177Speter * Higher numerical value means higher priority / likelihood of being 88289177Speter * selected over others. 89289177Speter * 90289177Speter * Use SCRATCH_POOL for temporary allocations. 91289177Speter */ 92289177Spetersvn_error_t * 93289177Spetersvn_fs_x__reps_add_base(svn_fs_x__reps_builder_t *builder, 94289177Speter svn_fs_x__representation_t *rep, 95289177Speter int priority, 96289177Speter apr_pool_t *scratch_pool); 97289177Speter 98289177Speter/* Add the byte string CONTENTS to BUILDER. Return the item index under 99289177Speter * which the fulltext can be retrieved from the final container in *REP_IDX. 100289177Speter */ 101289177Spetersvn_error_t * 102289177Spetersvn_fs_x__reps_add(apr_size_t *rep_idx, 103289177Speter svn_fs_x__reps_builder_t *builder, 104289177Speter const svn_string_t *contents); 105289177Speter 106289177Speter/* Return a rough estimate in bytes for the serialized representation 107289177Speter * of BUILDER. 108289177Speter */ 109289177Speterapr_size_t 110289177Spetersvn_fs_x__reps_estimate_size(const svn_fs_x__reps_builder_t *builder); 111289177Speter 112289177Speter/* Read from representation containers. */ 113289177Speter 114289177Speter/* For fulltext IDX in CONTAINER in filesystem FS, create an extract object 115289177Speter * allocated in POOL and return it in *EXTRACTOR. 116289177Speter */ 117289177Spetersvn_error_t * 118289177Spetersvn_fs_x__reps_get(svn_fs_x__rep_extractor_t **extractor, 119289177Speter svn_fs_t *fs, 120289177Speter const svn_fs_x__reps_t *container, 121289177Speter apr_size_t idx, 122289177Speter apr_pool_t *pool); 123289177Speter 124289177Speter/* Let the EXTRACTOR object fetch all parts of the desired fulltext and 125289177Speter * return the latter in *CONTENTS. If SIZE is not 0, return SIZE bytes 126289177Speter * starting at offset START_OFFSET of the full contents. If that range 127289177Speter * lies partly or completely outside the content, clip it accordingly. 128289177Speter * Allocate the result in RESULT_POOL and use SCRATCH_POOL for temporary 129289177Speter * allocations. 130289177Speter * 131289177Speter * Note, you may not run this inside a cache access function. 132289177Speter */ 133289177Spetersvn_error_t * 134289177Spetersvn_fs_x__extractor_drive(svn_stringbuf_t** contents, 135289177Speter svn_fs_x__rep_extractor_t* extractor, 136289177Speter apr_size_t start_offset, 137289177Speter apr_size_t size, 138289177Speter apr_pool_t* result_pool, 139289177Speter apr_pool_t* scratch_pool); 140289177Speter 141289177Speter/* I/O interface. */ 142289177Speter 143289177Speter/* Write a serialized representation of the final container described by 144289177Speter * BUILDER to STREAM. Use SCRATCH_POOL for temporary allocations. 145289177Speter */ 146289177Spetersvn_error_t * 147289177Spetersvn_fs_x__write_reps_container(svn_stream_t *stream, 148289177Speter const svn_fs_x__reps_builder_t *builder, 149289177Speter apr_pool_t *scratch_pool); 150289177Speter 151289177Speter/* Read a representations container from its serialized representation in 152289177Speter * STREAM. Allocate the result in RESULT_POOL and return it in *CONTAINER. 153289177Speter * Use SCRATCH_POOL for temporary allocations. 154289177Speter */ 155289177Spetersvn_error_t * 156289177Spetersvn_fs_x__read_reps_container(svn_fs_x__reps_t **container, 157289177Speter svn_stream_t *stream, 158289177Speter apr_pool_t *result_pool, 159289177Speter apr_pool_t *scratch_pool); 160289177Speter 161289177Speter/* Implements #svn_cache__serialize_func_t for svn_fs_x__reps_t objects. 162289177Speter */ 163289177Spetersvn_error_t * 164289177Spetersvn_fs_x__serialize_reps_container(void **data, 165289177Speter apr_size_t *data_len, 166289177Speter void *in, 167289177Speter apr_pool_t *pool); 168289177Speter 169289177Speter/* Implements #svn_cache__deserialize_func_t for svn_fs_x__reps_t objects. 170289177Speter */ 171289177Spetersvn_error_t * 172289177Spetersvn_fs_x__deserialize_reps_container(void **out, 173289177Speter void *data, 174289177Speter apr_size_t data_len, 175289177Speter apr_pool_t *pool); 176289177Speter 177289177Speter/* Implements svn_cache__partial_getter_func_t for svn_fs_x__reps_t, 178289177Speter * setting *OUT to an svn_fs_x__rep_extractor_t object defined by the 179289177Speter * svn_fs_x__reps_baton_t passed in as *BATON. This function is similar 180289177Speter * to svn_fs_x__reps_get but operates on the cache serialized 181289177Speter * representation of the container. 182289177Speter */ 183289177Spetersvn_error_t * 184289177Spetersvn_fs_x__reps_get_func(void **out, 185289177Speter const void *data, 186289177Speter apr_size_t data_len, 187289177Speter void *baton, 188289177Speter apr_pool_t *pool); 189289177Speter 190289177Speter#endif 191