bdb-err.c revision 302408
155714Skris/* 255714Skris * err.c : implementation of fs-private error functions 355714Skris * 455714Skris * ==================================================================== 555714Skris * Licensed to the Apache Software Foundation (ASF) under one 655714Skris * or more contributor license agreements. See the NOTICE file 755714Skris * distributed with this work for additional information 8280304Sjkim * regarding copyright ownership. The ASF licenses this file 955714Skris * to you under the Apache License, Version 2.0 (the 1055714Skris * "License"); you may not use this file except in compliance 1155714Skris * with the License. You may obtain a copy of the License at 1255714Skris * 1355714Skris * http://www.apache.org/licenses/LICENSE-2.0 1455714Skris * 15280304Sjkim * Unless required by applicable law or agreed to in writing, 1655714Skris * software distributed under the License is distributed on an 1755714Skris * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 1855714Skris * KIND, either express or implied. See the License for the 1955714Skris * specific language governing permissions and limitations 2055714Skris * under the License. 2155714Skris * ==================================================================== 22280304Sjkim */ 2355714Skris 2455714Skris 2555714Skris 2655714Skris#include <stdlib.h> 2755714Skris#include <stdarg.h> 2855714Skris 2955714Skris#include <apr_strings.h> 3055714Skris 3155714Skris#include "svn_fs.h" 3255714Skris#include "../fs.h" 3355714Skris#include "../err.h" 3455714Skris#include "../../libsvn_fs/fs-loader.h" 3555714Skris#include "bdb-err.h" 3655714Skris 37280304Sjkim#define SVN_WANT_BDB 3855714Skris#include "svn_private_config.h" 3955714Skris 40280304Sjkim 4155714Skris/* Return a distinguished error for any db error code we want to detect 4255714Skris * programatically; otherwise return a generic error. 4355714Skris */ 4455714Skrisstatic int 4555714Skrisbdb_err_to_apr_err(int db_err) 4655714Skris{ 4755714Skris if (db_err == DB_LOCK_DEADLOCK) 4855714Skris return SVN_ERR_FS_BERKELEY_DB_DEADLOCK; 4955714Skris else 5055714Skris return SVN_ERR_FS_BERKELEY_DB; 5155714Skris} 52280304Sjkim 5355714Skris 5455714Skrissvn_error_t * 5555714Skrissvn_fs_bdb__dberr(bdb_env_baton_t *bdb_baton, int db_err) 5655714Skris{ 5755714Skris svn_error_t *child_errors; 5872613Skris 59238405Sjkim child_errors = bdb_baton->error_info->pending_errors; 6072613Skris bdb_baton->error_info->pending_errors = NULL; 6172613Skris 6272613Skris return svn_error_create(bdb_err_to_apr_err(db_err), child_errors, 6372613Skris db_strerror(db_err)); 6472613Skris} 6572613Skris 66280304Sjkim 6772613Skrissvn_error_t * 6872613Skrissvn_fs_bdb__dberrf(bdb_env_baton_t *bdb_baton, 6972613Skris int db_err, const char *fmt, ...) 7072613Skris{ 7172613Skris va_list ap; 7272613Skris char *msg; 7372613Skris svn_error_t *err; 7472613Skris svn_error_t *child_errors; 7572613Skris 7672613Skris child_errors = bdb_baton->error_info->pending_errors; 7772613Skris bdb_baton->error_info->pending_errors = NULL; 7872613Skris 7972613Skris err = svn_error_create(bdb_err_to_apr_err(db_err), child_errors, NULL); 8072613Skris 8172613Skris va_start(ap, fmt); 8272613Skris msg = apr_pvsprintf(err->pool, fmt, ap); 8372613Skris va_end(ap); 8472613Skris err->message = apr_psprintf(err->pool, "%s%s", msg, db_strerror(db_err)); 8572613Skris return svn_error_trace(err); 8672613Skris} 8772613Skris 8872613Skris 8972613Skrissvn_error_t * 9072613Skrissvn_fs_bdb__wrap_db(svn_fs_t *fs, const char *operation, int db_err) 9172613Skris{ 9272613Skris base_fs_data_t *bfd = fs->fsap_data; 9372613Skris 9472613Skris if (! db_err) 9572613Skris { 9672613Skris svn_error_clear(bfd->bdb->error_info->pending_errors); 9772613Skris bfd->bdb->error_info->pending_errors = NULL; 9872613Skris return SVN_NO_ERROR; 9972613Skris } 10072613Skris 10172613Skris bfd = fs->fsap_data; 10272613Skris return svn_fs_bdb__dberrf 10372613Skris (bfd->bdb, db_err, 10472613Skris _("Berkeley DB error for filesystem '%s' while %s:\n"), 10572613Skris fs->path ? fs->path : "(none)", _(operation)); 10672613Skris} 10772613Skris