1251881Speter/* fs.h : interface to Subversion filesystem, private to libsvn_fs 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_BASE_H 24251881Speter#define SVN_LIBSVN_FS_BASE_H 25251881Speter 26251881Speter#define SVN_WANT_BDB 27251881Speter#include "svn_private_config.h" 28251881Speter 29251881Speter#include <apr_pools.h> 30251881Speter#include <apr_hash.h> 31251881Speter#include "svn_fs.h" 32251881Speter 33251881Speter#include "bdb/env.h" 34251881Speter 35251881Speter#ifdef __cplusplus 36251881Speterextern "C" { 37251881Speter#endif /* __cplusplus */ 38251881Speter 39251881Speter 40251881Speter/*** Filesystem schema versions ***/ 41251881Speter 42251881Speter/* The format number of this filesystem. This is independent of the 43251881Speter repository format number, and independent of any other FS back 44251881Speter ends. See the SVN_FS_BASE__MIN_*_FORMAT defines to get a sense of 45251881Speter what changes and features were added in which versions of this 46251881Speter back-end's format. */ 47251881Speter#define SVN_FS_BASE__FORMAT_NUMBER 4 48251881Speter 49251881Speter/* Minimum format number that supports representation sharing. This 50251881Speter also brings in the support for storing SHA1 checksums. */ 51251881Speter#define SVN_FS_BASE__MIN_REP_SHARING_FORMAT 4 52251881Speter 53251881Speter/* Minimum format number that supports the 'miscellaneous' table */ 54251881Speter#define SVN_FS_BASE__MIN_MISCELLANY_FORMAT 4 55251881Speter 56251881Speter/* Minimum format number that supports forward deltas */ 57251881Speter#define SVN_FS_BASE__MIN_FORWARD_DELTAS_FORMAT 4 58251881Speter 59251881Speter/* Minimum format number that supports node-origins tracking */ 60251881Speter#define SVN_FS_BASE__MIN_NODE_ORIGINS_FORMAT 3 61251881Speter 62251881Speter/* Minimum format number that supports mergeinfo */ 63251881Speter#define SVN_FS_BASE__MIN_MERGEINFO_FORMAT 3 64251881Speter 65251881Speter/* Minimum format number that supports svndiff version 1. */ 66251881Speter#define SVN_FS_BASE__MIN_SVNDIFF1_FORMAT 2 67251881Speter 68251881Speter/* Return SVN_ERR_UNSUPPORTED_FEATURE if the version of filesystem FS does 69251881Speter not indicate support for FEATURE (which REQUIRES a newer version). */ 70251881Spetersvn_error_t * 71251881Spetersvn_fs_base__test_required_feature_format(svn_fs_t *fs, 72251881Speter const char *feature, 73251881Speter int requires); 74251881Speter 75251881Speter 76251881Speter 77251881Speter/*** Miscellany keys. ***/ 78251881Speter 79251881Speter/* Revision at which the repo started using forward deltas. */ 80251881Speter#define SVN_FS_BASE__MISC_FORWARD_DELTA_UPGRADE "forward-delta-rev" 81251881Speter 82251881Speter 83251881Speter 84251881Speter/*** The filesystem structure. ***/ 85251881Speter 86251881Spetertypedef struct base_fs_data_t 87251881Speter{ 88251881Speter /* A Berkeley DB environment for all the filesystem's databases. 89251881Speter This establishes the scope of the filesystem's transactions. */ 90251881Speter bdb_env_baton_t *bdb; 91251881Speter 92251881Speter /* The filesystem's various tables. See `structure' for details. */ 93251881Speter DB *changes; 94251881Speter DB *copies; 95251881Speter DB *nodes; 96251881Speter DB *representations; 97251881Speter DB *revisions; 98251881Speter DB *strings; 99251881Speter DB *transactions; 100251881Speter DB *uuids; 101251881Speter DB *locks; 102251881Speter DB *lock_tokens; 103251881Speter DB *node_origins; 104251881Speter DB *miscellaneous; 105251881Speter DB *checksum_reps; 106251881Speter 107251881Speter /* A boolean for tracking when we have a live Berkeley DB 108251881Speter transaction trail alive. */ 109251881Speter svn_boolean_t in_txn_trail; 110251881Speter 111251881Speter /* The format number of this FS. */ 112251881Speter int format; 113251881Speter 114251881Speter} base_fs_data_t; 115251881Speter 116251881Speter 117251881Speter/*** Filesystem Revision ***/ 118251881Spetertypedef struct revision_t 119251881Speter{ 120251881Speter /* id of the transaction that was committed to create this 121251881Speter revision. */ 122251881Speter const char *txn_id; 123251881Speter 124251881Speter} revision_t; 125251881Speter 126251881Speter 127251881Speter/*** Transaction Kind ***/ 128251881Spetertypedef enum transaction_kind_t 129251881Speter{ 130251881Speter transaction_kind_normal = 1, /* normal, uncommitted */ 131251881Speter transaction_kind_committed, /* committed */ 132251881Speter transaction_kind_dead /* uncommitted and dead */ 133251881Speter 134251881Speter} transaction_kind_t; 135251881Speter 136251881Speter 137251881Speter/*** Filesystem Transaction ***/ 138251881Spetertypedef struct transaction_t 139251881Speter{ 140251881Speter /* kind of transaction. */ 141251881Speter transaction_kind_t kind; 142251881Speter 143251881Speter /* revision which this transaction was committed to create, or an 144251881Speter invalid revision number if this transaction was never committed. */ 145251881Speter svn_revnum_t revision; 146251881Speter 147251881Speter /* property list (const char * name, svn_string_t * value). 148251881Speter may be NULL if there are no properties. */ 149251881Speter apr_hash_t *proplist; 150251881Speter 151251881Speter /* node revision id of the root node. */ 152251881Speter const svn_fs_id_t *root_id; 153251881Speter 154251881Speter /* node revision id of the node which is the root of the revision 155251881Speter upon which this txn is base. (unfinished only) */ 156251881Speter const svn_fs_id_t *base_id; 157251881Speter 158251881Speter /* copies list (const char * copy_ids), or NULL if there have been 159251881Speter no copies in this transaction. */ 160251881Speter apr_array_header_t *copies; 161251881Speter 162251881Speter} transaction_t; 163251881Speter 164251881Speter 165251881Speter/*** Node-Revision ***/ 166251881Spetertypedef struct node_revision_t 167251881Speter{ 168251881Speter /* node kind */ 169251881Speter svn_node_kind_t kind; 170251881Speter 171251881Speter /* predecessor node revision id, or NULL if there is no predecessor 172251881Speter for this node revision */ 173251881Speter const svn_fs_id_t *predecessor_id; 174251881Speter 175251881Speter /* number of predecessors this node revision has (recursively), or 176251881Speter -1 if not known (for backward compatibility). */ 177251881Speter int predecessor_count; 178251881Speter 179251881Speter /* representation key for this node's properties. may be NULL if 180251881Speter there are no properties. */ 181251881Speter const char *prop_key; 182251881Speter 183251881Speter /* representation key for this node's text data (files) or entries 184251881Speter list (dirs). may be NULL if there are no contents. */ 185251881Speter const char *data_key; 186251881Speter 187251881Speter /* data representation instance identifier. Sounds fancy, but is 188251881Speter really just a way to distinguish between "I use the same rep key 189251881Speter as another node because we share ancestry and haven't had our 190251881Speter text touched at all" and "I use the same rep key as another node 191251881Speter only because one or both of us decided to pick up a shared 192251881Speter representation after-the-fact." May be NULL (if this node 193251881Speter revision isn't using a shared rep, or isn't the original 194251881Speter "assignee" of a shared rep). */ 195251881Speter const char *data_key_uniquifier; 196251881Speter 197251881Speter /* representation key for this node's text-data-in-progess (files 198251881Speter only). NULL if no edits are currently in-progress. This field 199251881Speter is always NULL for kinds other than "file". */ 200251881Speter const char *edit_key; 201251881Speter 202251881Speter /* path at which this node first came into existence. */ 203251881Speter const char *created_path; 204251881Speter 205251881Speter /* does this node revision have the mergeinfo tracking property set 206251881Speter on it? (only valid for FS schema 3 and newer) */ 207251881Speter svn_boolean_t has_mergeinfo; 208251881Speter 209251881Speter /* number of children of this node which have the mergeinfo tracking 210251881Speter property set (0 for files; valid only for FS schema 3 and newer). */ 211251881Speter apr_int64_t mergeinfo_count; 212251881Speter 213251881Speter} node_revision_t; 214251881Speter 215251881Speter 216251881Speter/*** Representation Kind ***/ 217251881Spetertypedef enum rep_kind_t 218251881Speter{ 219251881Speter rep_kind_fulltext = 1, /* fulltext */ 220251881Speter rep_kind_delta /* delta */ 221251881Speter 222251881Speter} rep_kind_t; 223251881Speter 224251881Speter 225251881Speter/*** "Delta" Offset/Window Chunk ***/ 226251881Spetertypedef struct rep_delta_chunk_t 227251881Speter{ 228251881Speter /* diff format version number ### at this point, "svndiff" is the 229251881Speter only format used. */ 230251881Speter apr_byte_t version; 231251881Speter 232251881Speter /* starting offset of the data represented by this chunk */ 233251881Speter svn_filesize_t offset; 234251881Speter 235251881Speter /* string-key to which this representation points. */ 236251881Speter const char *string_key; 237251881Speter 238251881Speter /* size of the fulltext data represented by this delta window. */ 239251881Speter apr_size_t size; 240251881Speter 241251881Speter /* representation-key to use when needed source data for 242251881Speter undeltification. */ 243251881Speter const char *rep_key; 244251881Speter 245251881Speter /* apr_off_t rep_offset; ### not implemented */ 246251881Speter 247251881Speter} rep_delta_chunk_t; 248251881Speter 249251881Speter 250251881Speter/*** Representation ***/ 251251881Spetertypedef struct representation_t 252251881Speter{ 253251881Speter /* representation kind */ 254251881Speter rep_kind_t kind; 255251881Speter 256251881Speter /* transaction ID under which representation was created (used as a 257251881Speter mutability flag when compared with a current editing 258251881Speter transaction). */ 259251881Speter const char *txn_id; 260251881Speter 261251881Speter /* Checksums for the contents produced by this representation. 262251881Speter These checksum is for the contents the rep shows to consumers, 263251881Speter regardless of how the rep stores the data under the hood. It is 264251881Speter independent of the storage (fulltext, delta, whatever). 265251881Speter 266251881Speter If this is NULL, then for compatibility behave as though 267251881Speter this checksum matches the expected checksum. */ 268251881Speter svn_checksum_t *md5_checksum; 269251881Speter svn_checksum_t *sha1_checksum; 270251881Speter 271251881Speter /* kind-specific stuff */ 272251881Speter union 273251881Speter { 274251881Speter /* fulltext stuff */ 275251881Speter struct 276251881Speter { 277251881Speter /* string-key which holds the fulltext data */ 278251881Speter const char *string_key; 279251881Speter 280251881Speter } fulltext; 281251881Speter 282251881Speter /* delta stuff */ 283251881Speter struct 284251881Speter { 285251881Speter /* an array of rep_delta_chunk_t * chunks of delta 286251881Speter information */ 287251881Speter apr_array_header_t *chunks; 288251881Speter 289251881Speter } delta; 290251881Speter } contents; 291251881Speter} representation_t; 292251881Speter 293251881Speter 294251881Speter/*** Copy Kind ***/ 295251881Spetertypedef enum copy_kind_t 296251881Speter{ 297251881Speter copy_kind_real = 1, /* real copy */ 298251881Speter copy_kind_soft /* soft copy */ 299251881Speter 300251881Speter} copy_kind_t; 301251881Speter 302251881Speter 303251881Speter/*** Copy ***/ 304251881Spetertypedef struct copy_t 305251881Speter{ 306251881Speter /* What kind of copy occurred. */ 307251881Speter copy_kind_t kind; 308251881Speter 309251881Speter /* Path of copy source. */ 310251881Speter const char *src_path; 311251881Speter 312251881Speter /* Transaction id of copy source. */ 313251881Speter const char *src_txn_id; 314251881Speter 315251881Speter /* Node-revision of copy destination. */ 316251881Speter const svn_fs_id_t *dst_noderev_id; 317251881Speter 318251881Speter} copy_t; 319251881Speter 320251881Speter 321251881Speter/*** Change ***/ 322251881Spetertypedef struct change_t 323251881Speter{ 324251881Speter /* Path of the change. */ 325251881Speter const char *path; 326251881Speter 327251881Speter /* Node revision ID of the change. */ 328251881Speter const svn_fs_id_t *noderev_id; 329251881Speter 330251881Speter /* The kind of change. */ 331251881Speter svn_fs_path_change_kind_t kind; 332251881Speter 333251881Speter /* Text or property mods? */ 334251881Speter svn_boolean_t text_mod; 335251881Speter svn_boolean_t prop_mod; 336251881Speter 337251881Speter} change_t; 338251881Speter 339251881Speter 340251881Speter/*** Lock node ***/ 341251881Spetertypedef struct lock_node_t 342251881Speter{ 343251881Speter /* entries list, maps (const char *) name --> (const char *) lock-node-id */ 344251881Speter apr_hash_t *entries; 345251881Speter 346251881Speter /* optional lock-token, might be NULL. */ 347251881Speter const char *lock_token; 348251881Speter 349251881Speter} lock_node_t; 350251881Speter 351251881Speter 352251881Speter 353251881Speter#ifdef __cplusplus 354251881Speter} 355251881Speter#endif /* __cplusplus */ 356251881Speter 357251881Speter#endif /* SVN_LIBSVN_FS_BASE_H */ 358