1251881Speter/* uuids-table.c : operations on the `uuids' 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 <apr_uuid.h> 24251881Speter 25251881Speter#include "bdb_compat.h" 26251881Speter#include "svn_fs.h" 27251881Speter#include "../fs.h" 28251881Speter#include "../err.h" 29251881Speter#include "dbt.h" 30251881Speter#include "../trail.h" 31251881Speter#include "../../libsvn_fs/fs-loader.h" 32251881Speter#include "bdb-err.h" 33251881Speter#include "uuids-table.h" 34251881Speter 35251881Speter#include "svn_private_config.h" 36251881Speter 37251881Speter 38251881Speter/*** Creating and opening the uuids table. 39251881Speter When the table is created, the repository's uuid is 40251881Speter generated and stored as record #1. ***/ 41251881Speter 42251881Speterint 43251881Spetersvn_fs_bdb__open_uuids_table(DB **uuids_p, 44251881Speter DB_ENV *env, 45251881Speter svn_boolean_t create) 46251881Speter{ 47251881Speter const u_int32_t open_flags = (create ? (DB_CREATE | DB_EXCL) : 0); 48251881Speter DB *uuids; 49251881Speter int error; 50251881Speter 51251881Speter BDB_ERR(svn_fs_bdb__check_version()); 52251881Speter BDB_ERR(db_create(&uuids, env, 0)); 53251881Speter BDB_ERR(uuids->set_re_len(uuids, APR_UUID_FORMATTED_LENGTH)); 54251881Speter 55251881Speter error = (uuids->open)(SVN_BDB_OPEN_PARAMS(uuids, NULL), 56251881Speter "uuids", 0, DB_RECNO, 57251881Speter open_flags, 0666); 58251881Speter 59251881Speter /* This is a temporary compatibility check; it creates the 60251881Speter UUIDs table if one does not already exist. */ 61251881Speter if (error == ENOENT && (! create)) 62251881Speter { 63251881Speter BDB_ERR(uuids->close(uuids, 0)); 64251881Speter return svn_fs_bdb__open_uuids_table(uuids_p, env, TRUE); 65251881Speter } 66251881Speter 67251881Speter BDB_ERR(error); 68251881Speter 69251881Speter if (create) 70251881Speter { 71251881Speter char buffer[APR_UUID_FORMATTED_LENGTH + 1]; 72251881Speter DBT key, value; 73251881Speter apr_uuid_t uuid; 74251881Speter int recno = 0; 75251881Speter 76251881Speter svn_fs_base__clear_dbt(&key); 77251881Speter key.data = &recno; 78251881Speter key.size = sizeof(recno); 79251881Speter key.ulen = key.size; 80251881Speter key.flags |= DB_DBT_USERMEM; 81251881Speter 82251881Speter svn_fs_base__clear_dbt(&value); 83251881Speter value.data = buffer; 84251881Speter value.size = sizeof(buffer) - 1; 85251881Speter 86251881Speter apr_uuid_get(&uuid); 87251881Speter apr_uuid_format(buffer, &uuid); 88251881Speter 89251881Speter BDB_ERR(uuids->put(uuids, 0, &key, &value, DB_APPEND)); 90251881Speter } 91251881Speter 92251881Speter *uuids_p = uuids; 93251881Speter return 0; 94251881Speter} 95251881Speter 96251881Spetersvn_error_t *svn_fs_bdb__get_uuid(svn_fs_t *fs, 97251881Speter int idx, 98251881Speter const char **uuid, 99251881Speter trail_t *trail, 100251881Speter apr_pool_t *pool) 101251881Speter{ 102251881Speter base_fs_data_t *bfd = fs->fsap_data; 103251881Speter char buffer[APR_UUID_FORMATTED_LENGTH + 1]; 104251881Speter DB *uuids = bfd->uuids; 105251881Speter DBT key; 106251881Speter DBT value; 107251881Speter 108251881Speter svn_fs_base__clear_dbt(&key); 109251881Speter key.data = &idx; 110251881Speter key.size = sizeof(idx); 111251881Speter 112251881Speter svn_fs_base__clear_dbt(&value); 113251881Speter value.data = buffer; 114251881Speter value.size = sizeof(buffer) - 1; 115251881Speter value.ulen = value.size; 116251881Speter value.flags |= DB_DBT_USERMEM; 117251881Speter 118251881Speter svn_fs_base__trail_debug(trail, "uuids", "get"); 119251881Speter SVN_ERR(BDB_WRAP(fs, N_("get repository uuid"), 120251881Speter uuids->get(uuids, trail->db_txn, &key, &value, 0))); 121251881Speter 122251881Speter *uuid = apr_pstrmemdup(pool, value.data, value.size); 123251881Speter 124251881Speter return SVN_NO_ERROR; 125251881Speter} 126251881Speter 127251881Spetersvn_error_t *svn_fs_bdb__set_uuid(svn_fs_t *fs, 128251881Speter int idx, 129251881Speter const char *uuid, 130251881Speter trail_t *trail, 131251881Speter apr_pool_t *pool) 132251881Speter{ 133251881Speter base_fs_data_t *bfd = fs->fsap_data; 134251881Speter DB *uuids = bfd->uuids; 135251881Speter DBT key; 136251881Speter DBT value; 137251881Speter 138251881Speter svn_fs_base__clear_dbt(&key); 139251881Speter key.data = &idx; 140251881Speter key.size = sizeof(idx); 141251881Speter 142251881Speter svn_fs_base__clear_dbt(&value); 143251881Speter value.size = (u_int32_t) strlen(uuid); 144251881Speter value.data = apr_pstrmemdup(pool, uuid, value.size + 1); 145251881Speter 146251881Speter svn_fs_base__trail_debug(trail, "uuids", "put"); 147251881Speter return BDB_WRAP(fs, N_("set repository uuid"), 148251881Speter uuids->put(uuids, trail->db_txn, &key, &value, 0)); 149251881Speter} 150