1251881Speter/* miscellaneous-table.c : operations on the `miscellaneous' table 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#include <assert.h> 25251881Speter#include "bdb_compat.h" 26251881Speter 27251881Speter#include "svn_pools.h" 28251881Speter#include "dbt.h" 29251881Speter#include "../err.h" 30251881Speter#include "../fs.h" 31251881Speter#include "../trail.h" 32251881Speter#include "../../libsvn_fs/fs-loader.h" 33251881Speter#include "bdb-err.h" 34251881Speter#include "miscellaneous-table.h" 35251881Speter 36251881Speter#include "private/svn_fs_util.h" 37251881Speter 38251881Speter 39251881Speterint 40251881Spetersvn_fs_bdb__open_miscellaneous_table(DB **miscellaneous_p, 41251881Speter DB_ENV *env, 42251881Speter svn_boolean_t create) 43251881Speter{ 44251881Speter const u_int32_t open_flags = (create ? (DB_CREATE | DB_EXCL) : 0); 45251881Speter DB *miscellaneous; 46251881Speter int error; 47251881Speter 48251881Speter BDB_ERR(svn_fs_bdb__check_version()); 49251881Speter BDB_ERR(db_create(&miscellaneous, env, 0)); 50251881Speter error = (miscellaneous->open)(SVN_BDB_OPEN_PARAMS(miscellaneous, NULL), 51251881Speter "miscellaneous", 0, DB_BTREE, 52251881Speter open_flags, 0666); 53251881Speter 54251881Speter /* Create the table if it doesn't yet exist. This is a form of 55251881Speter automagical repository upgrading. */ 56251881Speter if (error == ENOENT && (! create)) 57251881Speter { 58251881Speter BDB_ERR(miscellaneous->close(miscellaneous, 0)); 59251881Speter return svn_fs_bdb__open_miscellaneous_table(miscellaneous_p, env, TRUE); 60251881Speter } 61251881Speter BDB_ERR(error); 62251881Speter 63251881Speter /* If we're creating the table from scratch (not upgrading), record the 64251881Speter upgrade rev as 0. */ 65251881Speter if (create) 66251881Speter { 67251881Speter DBT key, value; 68251881Speter 69251881Speter BDB_ERR(miscellaneous->put 70251881Speter (miscellaneous, 0, 71251881Speter svn_fs_base__str_to_dbt 72251881Speter (&key, SVN_FS_BASE__MISC_FORWARD_DELTA_UPGRADE), 73251881Speter svn_fs_base__str_to_dbt(&value, "0"), 0)); 74251881Speter } 75251881Speter 76251881Speter *miscellaneous_p = miscellaneous; 77251881Speter return 0; 78251881Speter} 79251881Speter 80251881Speter 81251881Spetersvn_error_t * 82251881Spetersvn_fs_bdb__miscellaneous_set(svn_fs_t *fs, 83251881Speter const char *key_str, 84251881Speter const char *val, 85251881Speter trail_t *trail, 86251881Speter apr_pool_t *pool) 87251881Speter{ 88251881Speter base_fs_data_t *bfd = fs->fsap_data; 89251881Speter DBT key, value; 90251881Speter 91251881Speter svn_fs_base__str_to_dbt(&key, key_str); 92251881Speter if (val == NULL) 93251881Speter { 94251881Speter svn_fs_base__trail_debug(trail, "miscellaneous", "del"); 95251881Speter return BDB_WRAP(fs, N_("deleting record from 'miscellaneous' table"), 96251881Speter bfd->miscellaneous->del(bfd->miscellaneous, 97251881Speter trail->db_txn, &key, 0)); 98251881Speter } 99251881Speter else 100251881Speter { 101251881Speter svn_fs_base__str_to_dbt(&value, val); 102251881Speter svn_fs_base__trail_debug(trail, "miscellaneous", "add"); 103251881Speter return BDB_WRAP(fs, N_("storing miscellaneous record"), 104251881Speter bfd->miscellaneous->put(bfd->miscellaneous, 105251881Speter trail->db_txn, 106251881Speter &key, &value, 0)); 107251881Speter } 108251881Speter} 109251881Speter 110251881Speter 111251881Spetersvn_error_t * 112251881Spetersvn_fs_bdb__miscellaneous_get(const char **val, 113251881Speter svn_fs_t *fs, 114251881Speter const char *key_str, 115251881Speter trail_t *trail, 116251881Speter apr_pool_t *pool) 117251881Speter{ 118251881Speter base_fs_data_t *bfd = fs->fsap_data; 119251881Speter DBT key, value; 120251881Speter int db_err; 121251881Speter 122251881Speter *val = NULL; 123251881Speter svn_fs_base__trail_debug(trail, "miscellaneous", "get"); 124251881Speter db_err = bfd->miscellaneous->get(bfd->miscellaneous, trail->db_txn, 125251881Speter svn_fs_base__str_to_dbt(&key, key_str), 126251881Speter svn_fs_base__result_dbt(&value), 0); 127251881Speter svn_fs_base__track_dbt(&value, pool); 128251881Speter 129251881Speter if (db_err != DB_NOTFOUND) 130251881Speter { 131251881Speter SVN_ERR(BDB_WRAP(fs, N_("fetching miscellaneous record"), db_err)); 132251881Speter *val = apr_pstrmemdup(pool, value.data, value.size); 133251881Speter } 134251881Speter return SVN_NO_ERROR; 135251881Speter} 136