Branch data Line data Source code
1 : : /** @file error.cc
2 : : * @brief Xapian::Error base class.
3 : : */
4 : : /* Copyright (C) 2007,2008 Olly Betts
5 : : *
6 : : * This program is free software; you can redistribute it and/or
7 : : * modify it under the terms of the GNU General Public License as
8 : : * published by the Free Software Foundation; either version 2 of the
9 : : * License, or (at your option) any later version.
10 : : *
11 : : * This program is distributed in the hope that it will be useful,
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : : * GNU General Public License for more details.
15 : : *
16 : : * You should have received a copy of the GNU General Public License
17 : : * along with this program; if not, write to the Free Software
18 : : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 : : */
20 : :
21 : : #include <config.h>
22 : :
23 : : #include <xapian/error.h>
24 : :
25 : : #include "safeerrno.h"
26 : : #ifdef __WIN32__
27 : : # include "safewindows.h"
28 : : #else
29 : : # include <netdb.h>
30 : : #endif
31 : :
32 : : #include <cstdio> // For sprintf().
33 : : #include <cstring> // For strerror().
34 : :
35 : : #include "str.h"
36 : :
37 : : using namespace std;
38 : :
39 : 54527 : Xapian::Error::Error(const std::string &msg_, const std::string &context_,
40 : : const char * type_, const char * error_string_)
41 : : : msg(msg_), context(context_), type(type_), my_errno(0),
42 : 54527 : error_string(), already_handled(false)
43 : : {
44 [ # # + + ]: 54527 : if (error_string_) error_string.assign(error_string_);
45 : 54527 : }
46 : :
47 : : const char *
48 : 55102 : Xapian::Error::get_error_string() const
49 : : {
50 [ + + ]: 55102 : if (!error_string.empty()) return error_string.c_str();
51 [ + + ]: 55097 : if (my_errno == 0) return NULL;
52 [ + - ]: 1 : if (my_errno > 0) {
53 : 1 : error_string.assign(strerror(my_errno));
54 : 1 : return error_string.c_str();
55 : : }
56 : : #ifdef __WIN32__
57 : : DWORD len;
58 : : char * error;
59 : : len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER,
60 : : 0, -my_errno, 0, (CHAR*)&error, 0, 0);
61 : : if (error) {
62 : : // Remove any trailing \r\n from output of FormatMessage.
63 : : if (len >= 2 && error[len - 2] == '\r' && error[len - 1] == '\n')
64 : : len -= 2;
65 : : error_string.assign(error, len);
66 : : LocalFree(error);
67 : : return error_string.c_str();
68 : : }
69 : : #else
70 : : # ifdef HAVE_HSTRERROR
71 : 0 : error_string.assign(hstrerror(-my_errno));
72 : 55102 : return error_string.c_str();
73 : : # else
74 : : const char * s = NULL;
75 : : switch (-my_errno) {
76 : : case HOST_NOT_FOUND:
77 : : s = "Unknown host";
78 : : break;
79 : : case NO_ADDRESS:
80 : : # if NO_ADDRESS != NO_DATA
81 : : case NO_DATA:
82 : : # endif
83 : : s = "No address associated with name";
84 : : break;
85 : : case NO_RECOVERY:
86 : : s = "Unknown server error";
87 : : break;
88 : : case TRY_AGAIN:
89 : : s = "Host name lookup failure";
90 : : break;
91 : : }
92 : : if (s) {
93 : : error_string.assign(s);
94 : : return error_string.c_str();
95 : : }
96 : : # endif
97 : : #endif
98 : :
99 : : #ifndef HAVE_HSTRERROR
100 : : error_string = "Unknown Error ";
101 : : error_string += str(-my_errno);
102 : : return error_string.c_str();
103 : : #endif
104 : : }
105 : :
106 : : string
107 : 565 : Xapian::Error::get_description() const
108 : : {
109 : 565 : string desc(type);
110 : 565 : desc += ": ";
111 : 565 : desc += msg;
112 [ + + ]: 565 : if (!context.empty()) {
113 : 564 : desc += " (context: ";
114 : 564 : desc += context;
115 : 564 : desc += ')';
116 : : }
117 : 565 : const char *e = get_error_string();
118 [ + + ]: 565 : if (e) {
119 : 1 : desc += " (";
120 : 1 : desc += e;
121 : 565 : desc += ')';
122 : : }
123 : 0 : return desc;
124 : : }
|