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