Skip to content

Commit ac622e4

Browse files
committed
Implement get_error_category() for Firebird errors
Recognize permission and constraint violation errors as well as a few other ones that haven't been actually observed but seem to match well the existing error categories.
1 parent 8400532 commit ac622e4

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

include/soci/firebird/soci-firebird.h

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ class SOCI_FIREBIRD_DECL firebird_soci_error : public soci_error
3636
firebird_soci_error(std::string const & msg,
3737
ISC_STATUS const * status = 0);
3838

39+
error_category get_error_category() const override;
40+
3941
std::string get_backend_name() const override { return "firebird"; }
4042
int get_backend_error_code() const override;
4143

src/backends/firebird/error-firebird.cpp

+41
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,47 @@ int firebird_soci_error::get_backend_error_code() const
6161
return 0;
6262
}
6363

64+
soci_error::error_category firebird_soci_error::get_error_category() const
65+
{
66+
switch (get_backend_error_code())
67+
{
68+
case isc_bad_db_format:
69+
case isc_unavailable:
70+
case isc_wrong_ods:
71+
case isc_badodsver:
72+
case isc_connect_reject:
73+
case isc_login:
74+
case isc_network_error:
75+
case isc_net_connect_err:
76+
case isc_lost_db_connection:
77+
return connection_error;
78+
79+
case isc_syntaxerr:
80+
case isc_dsql_error:
81+
case isc_command_end_err:
82+
return invalid_statement;
83+
84+
case isc_no_priv:
85+
return no_privilege;
86+
87+
case isc_not_valid:
88+
case isc_no_dup:
89+
case isc_foreign_key:
90+
case isc_primary_key_ref:
91+
case isc_primary_key_notnull:
92+
return constraint_violation;
93+
94+
case isc_tra_state:
95+
return unknown_transaction_state;
96+
97+
case isc_io_error:
98+
case isc_virmemexh:
99+
return system_error;
100+
}
101+
102+
return unknown;
103+
}
104+
64105
namespace details
65106
{
66107

0 commit comments

Comments
 (0)