1251881Speter/* 2251881Speter * err.c : implementation of fs-private error functions 3251881Speter * 4251881Speter * ==================================================================== 5251881Speter * Licensed to the Apache Software Foundation (ASF) under one 6251881Speter * or more contributor license agreements. See the NOTICE file 7251881Speter * distributed with this work for additional information 8251881Speter * regarding copyright ownership. The ASF licenses this file 9251881Speter * to you under the Apache License, Version 2.0 (the 10251881Speter * "License"); you may not use this file except in compliance 11251881Speter * with the License. You may obtain a copy of the License at 12251881Speter * 13251881Speter * http://www.apache.org/licenses/LICENSE-2.0 14251881Speter * 15251881Speter * Unless required by applicable law or agreed to in writing, 16251881Speter * software distributed under the License is distributed on an 17251881Speter * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 18251881Speter * KIND, either express or implied. See the License for the 19251881Speter * specific language governing permissions and limitations 20251881Speter * under the License. 21251881Speter * ==================================================================== 22251881Speter */ 23251881Speter 24251881Speter 25251881Speter 26251881Speter#include <stdlib.h> 27251881Speter#include <stdarg.h> 28251881Speter 29251881Speter#include <apr_strings.h> 30251881Speter 31251881Speter#include "svn_fs.h" 32251881Speter#include "../fs.h" 33251881Speter#include "../err.h" 34251881Speter#include "../../libsvn_fs/fs-loader.h" 35251881Speter#include "bdb-err.h" 36251881Speter 37251881Speter#define SVN_WANT_BDB 38251881Speter#include "svn_private_config.h" 39251881Speter 40251881Speter 41251881Speter/* Return a distinguished error for any db error code we want to detect 42251881Speter * programatically; otherwise return a generic error. 43251881Speter */ 44251881Speterstatic int 45251881Speterbdb_err_to_apr_err(int db_err) 46251881Speter{ 47251881Speter if (db_err == DB_LOCK_DEADLOCK) 48251881Speter return SVN_ERR_FS_BERKELEY_DB_DEADLOCK; 49251881Speter else 50251881Speter return SVN_ERR_FS_BERKELEY_DB; 51251881Speter} 52251881Speter 53251881Speter 54251881Spetersvn_error_t * 55251881Spetersvn_fs_bdb__dberr(bdb_env_baton_t *bdb_baton, int db_err) 56251881Speter{ 57251881Speter svn_error_t *child_errors; 58251881Speter 59251881Speter child_errors = bdb_baton->error_info->pending_errors; 60251881Speter bdb_baton->error_info->pending_errors = NULL; 61251881Speter 62251881Speter return svn_error_create(bdb_err_to_apr_err(db_err), child_errors, 63251881Speter db_strerror(db_err)); 64251881Speter} 65251881Speter 66251881Speter 67251881Spetersvn_error_t * 68251881Spetersvn_fs_bdb__dberrf(bdb_env_baton_t *bdb_baton, 69251881Speter int db_err, const char *fmt, ...) 70251881Speter{ 71251881Speter va_list ap; 72251881Speter char *msg; 73251881Speter svn_error_t *err; 74251881Speter svn_error_t *child_errors; 75251881Speter 76251881Speter child_errors = bdb_baton->error_info->pending_errors; 77251881Speter bdb_baton->error_info->pending_errors = NULL; 78251881Speter 79251881Speter err = svn_error_create(bdb_err_to_apr_err(db_err), child_errors, NULL); 80251881Speter 81251881Speter va_start(ap, fmt); 82251881Speter msg = apr_pvsprintf(err->pool, fmt, ap); 83251881Speter va_end(ap); 84251881Speter err->message = apr_psprintf(err->pool, "%s%s", msg, db_strerror(db_err)); 85251881Speter return svn_error_trace(err); 86251881Speter} 87251881Speter 88251881Speter 89251881Spetersvn_error_t * 90251881Spetersvn_fs_bdb__wrap_db(svn_fs_t *fs, const char *operation, int db_err) 91251881Speter{ 92251881Speter base_fs_data_t *bfd = fs->fsap_data; 93251881Speter 94251881Speter if (! db_err) 95251881Speter { 96251881Speter svn_error_clear(bfd->bdb->error_info->pending_errors); 97251881Speter bfd->bdb->error_info->pending_errors = NULL; 98251881Speter return SVN_NO_ERROR; 99251881Speter } 100251881Speter 101251881Speter bfd = fs->fsap_data; 102251881Speter return svn_fs_bdb__dberrf 103251881Speter (bfd->bdb, db_err, 104251881Speter _("Berkeley DB error for filesystem '%s' while %s:\n"), 105251881Speter fs->path ? fs->path : "(none)", _(operation)); 106251881Speter} 107