1251881Speter/* node-rev.c --- storing and retrieving NODE-REVISION skels 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#include <string.h> 24251881Speter 25251881Speter#define SVN_WANT_BDB 26251881Speter#include "svn_private_config.h" 27251881Speter 28251881Speter#include "svn_fs.h" 29251881Speter#include "fs.h" 30251881Speter#include "err.h" 31251881Speter#include "node-rev.h" 32251881Speter#include "reps-strings.h" 33251881Speter#include "id.h" 34251881Speter#include "../libsvn_fs/fs-loader.h" 35251881Speter 36251881Speter#include "bdb/nodes-table.h" 37251881Speter#include "bdb/node-origins-table.h" 38251881Speter 39251881Speter 40251881Speter/* Creating completely new nodes. */ 41251881Speter 42251881Speter 43251881Spetersvn_error_t * 44251881Spetersvn_fs_base__create_node(const svn_fs_id_t **id_p, 45251881Speter svn_fs_t *fs, 46251881Speter node_revision_t *noderev, 47251881Speter const char *copy_id, 48251881Speter const char *txn_id, 49251881Speter trail_t *trail, 50251881Speter apr_pool_t *pool) 51251881Speter{ 52251881Speter svn_fs_id_t *id; 53251881Speter base_fs_data_t *bfd = fs->fsap_data; 54251881Speter 55251881Speter /* Find an unused ID for the node. */ 56251881Speter SVN_ERR(svn_fs_bdb__new_node_id(&id, fs, copy_id, txn_id, trail, pool)); 57251881Speter 58251881Speter /* Store its NODE-REVISION skel. */ 59251881Speter SVN_ERR(svn_fs_bdb__put_node_revision(fs, id, noderev, trail, pool)); 60251881Speter 61251881Speter /* Add a record in the node origins index table if our format 62251881Speter supports it. */ 63251881Speter if (bfd->format >= SVN_FS_BASE__MIN_NODE_ORIGINS_FORMAT) 64251881Speter { 65251881Speter SVN_ERR(svn_fs_bdb__set_node_origin(fs, svn_fs_base__id_node_id(id), 66251881Speter id, trail, pool)); 67251881Speter } 68251881Speter 69251881Speter *id_p = id; 70251881Speter return SVN_NO_ERROR; 71251881Speter} 72251881Speter 73251881Speter 74251881Speter 75251881Speter/* Creating new revisions of existing nodes. */ 76251881Speter 77251881Spetersvn_error_t * 78251881Spetersvn_fs_base__create_successor(const svn_fs_id_t **new_id_p, 79251881Speter svn_fs_t *fs, 80251881Speter const svn_fs_id_t *old_id, 81251881Speter node_revision_t *new_noderev, 82251881Speter const char *copy_id, 83251881Speter const char *txn_id, 84251881Speter trail_t *trail, 85251881Speter apr_pool_t *pool) 86251881Speter{ 87251881Speter svn_fs_id_t *new_id; 88251881Speter 89251881Speter /* Choose an ID for the new node, and store it in the database. */ 90251881Speter SVN_ERR(svn_fs_bdb__new_successor_id(&new_id, fs, old_id, copy_id, 91251881Speter txn_id, trail, pool)); 92251881Speter 93251881Speter /* Store the new skel under that ID. */ 94251881Speter SVN_ERR(svn_fs_bdb__put_node_revision(fs, new_id, new_noderev, 95251881Speter trail, pool)); 96251881Speter 97251881Speter *new_id_p = new_id; 98251881Speter return SVN_NO_ERROR; 99251881Speter} 100251881Speter 101251881Speter 102251881Speter 103251881Speter/* Deleting a node revision. */ 104251881Speter 105251881Spetersvn_error_t * 106251881Spetersvn_fs_base__delete_node_revision(svn_fs_t *fs, 107251881Speter const svn_fs_id_t *id, 108251881Speter svn_boolean_t origin_also, 109251881Speter trail_t *trail, 110251881Speter apr_pool_t *pool) 111251881Speter{ 112251881Speter base_fs_data_t *bfd = fs->fsap_data; 113251881Speter 114251881Speter /* ### todo: here, we should adjust other nodes to compensate for 115251881Speter the missing node. */ 116251881Speter 117251881Speter /* Delete the node origin record, too, if asked to do so and our 118251881Speter format supports it. */ 119251881Speter if (origin_also && (bfd->format >= SVN_FS_BASE__MIN_NODE_ORIGINS_FORMAT)) 120251881Speter { 121251881Speter SVN_ERR(svn_fs_bdb__delete_node_origin(fs, svn_fs_base__id_node_id(id), 122251881Speter trail, pool)); 123251881Speter } 124251881Speter 125251881Speter return svn_fs_bdb__delete_nodes_entry(fs, id, trail, pool); 126251881Speter} 127