From 1659598cfe957f06e74f1584591337674cb19e81 Mon Sep 17 00:00:00 2001 From: David Steele Date: Thu, 8 Feb 2018 16:11:47 -0500 Subject: [PATCH] Create a master list of errors in build/error.yaml. The C and Perl errors lists are created automatically by Build.pm so they stay up to date. --- .travis.yml | 2 +- build/error.yaml | 93 ++++++++++ build/lib/pgBackRestBuild/Build.pm | 13 +- build/lib/pgBackRestBuild/Build/Common.pm | 2 + build/lib/pgBackRestBuild/Error/Build.pm | 136 +++++++++++++++ build/lib/pgBackRestBuild/Error/Data.pm | 52 ++++++ doc/xml/release.xml | 4 + lib/pgBackRest/Common/Exception.pm | 163 +---------------- lib/pgBackRest/Common/ExceptionAuto.pm | 173 +++++++++++++++++++ libc/Makefile.PL | 1 - libc/build/lib/pgBackRestLibC/Build.pm | 54 ++++++ src/Makefile | 2 - src/cipher/block.c | 1 - src/common/error.auto.c | 167 ++++++++++++++++++ src/common/error.auto.h | 88 ++++++++++ src/common/error.c | 86 +++++++++ src/common/error.h | 24 ++- src/common/errorType.c | 148 ---------------- src/common/errorType.h | 45 ----- src/common/memContext.c | 2 +- src/common/type/variant.c | 1 - test/Vagrantfile | 2 +- test/lib/pgBackRestTest/Common/CiTest.pm | 2 +- test/lib/pgBackRestTest/Common/DefineTest.pm | 2 +- test/src/module/common/exitTest.c | 4 +- test/test.pl | 10 ++ 26 files changed, 911 insertions(+), 366 deletions(-) create mode 100644 build/error.yaml create mode 100644 build/lib/pgBackRestBuild/Error/Build.pm create mode 100644 build/lib/pgBackRestBuild/Error/Data.pm create mode 100644 lib/pgBackRest/Common/ExceptionAuto.pm create mode 100644 src/common/error.auto.c create mode 100644 src/common/error.auto.h delete mode 100644 src/common/errorType.c delete mode 100644 src/common/errorType.h diff --git a/.travis.yml b/.travis.yml index d1aa86208..c7506f6c1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ env: - PGB_CI="doc" before_install: - - sudo apt-get -qq update && sudo apt-get install libxml-checker-perl libdbd-pg-perl libperl-critic-perl libtemplate-perl libpod-coverage-perl libtest-differences-perl libhtml-parser-perl lintian debhelper txt2man devscripts libjson-perl libio-socket-ssl-perl libxml-libxml-perl python-pip + - sudo apt-get -qq update && sudo apt-get install libxml-checker-perl libdbd-pg-perl libperl-critic-perl libtemplate-perl libpod-coverage-perl libtest-differences-perl libhtml-parser-perl lintian debhelper txt2man devscripts libjson-perl libio-socket-ssl-perl libxml-libxml-perl libyaml-perl python-pip - | # Install & Configure AWS CLI pip install --upgrade --user awscli diff --git a/build/error.yaml b/build/error.yaml new file mode 100644 index 000000000..b0392f60b --- /dev/null +++ b/build/error.yaml @@ -0,0 +1,93 @@ +# Error Definitions +# +# Master file for all errors in the C and Perl code. For C, errors are written to src/common/error.auto.c/h. For Perl, errors are +# written to lib/pgBackRest/Common/ExceptionAuto.pm. + +# Errors in the code that it should not be possible for the user to encounter -- i.e., a likely bug +assert: 25 + +checksum: 26 +config: 27 +file-invalid: 28 +format: 29 +command-required: 30 +option-invalid: 31 +option-invalid-value: 32 +option-invalid-range: 33 +option-invalid-pair: 34 +option-duplicate-key: 35 +option-negate: 36 +option-required: 37 +postmaster-running: 38 +protocol: 39 +path-not-empty: 40 +file-open: 41 +file-read: 42 +param-required: 43 +archive-mismatch: 44 +archive-duplicate: 45 +version-not-supported: 46 +path-create: 47 +command-invalid: 48 +host-connect: 49 +lock-acquire: 50 +backup-mismatch: 51 +file-sync: 52 +path-open: 53 +path-sync: 54 +file-missing: 55 +db-connect: 56 +db-query: 57 +db-mismatch: 58 +db-timeout: 59 +file-remove: 60 +path-remove: 61 +stop: 62 +term: 63 +file-write: 64 +protocol-timeout: 66 +feature-not-supported: 67 +archive-command-invalid: 68 +link-expected: 69 +link-destination: 70 +tablespace-in-pgdata: 71 +host-invalid: 72 +path-missing: 73 +file-move: 74 +backup-set-invalid: 75 +tablespace-map: 76 +path-type: 77 +link-map: 78 +file-close: 79 +db-missing: 80 +db-invalid: 81 +archive-timeout: 82 +file-mode: 83 +option-multiple-value: 84 +protocol-output-required: 85 +link-open: 86 +archive-disabled: 87 +file-owner: 88 +user-missing: 89 +option-command: 90 +group-missing: 91 +path-exists: 92 +file-exists: 93 + +# Memory allocation failed +memory: 94 + +cipher: 95 +param-invalid: 96 + +# This error should not be thrown directly -- it serves as a parent for the C errors +runtime: 122 + +# Error used when an invalid error code is passed to the Perl Exception object -- this should not happen +invalid: 123 + +# Used when a native Perl error is not caught before exitSafe() -- this should not happen +unhandled: 124 + +# Used when a specific error is not provided in the Perl code. This should be rare. +unknown: 125 diff --git a/build/lib/pgBackRestBuild/Build.pm b/build/lib/pgBackRestBuild/Build.pm index be44224f7..a59d86be4 100644 --- a/build/lib/pgBackRestBuild/Build.pm +++ b/build/lib/pgBackRestBuild/Build.pm @@ -48,6 +48,7 @@ sub buildAll my $rhFile = $rhBuild->{$strBuild}{&BLD_DATA}{&BLD_FILE}{$strFile}; my $rhFileConstant = $rhFile->{&BLD_CONSTANT_GROUP}; my $rhFileEnum = $rhFile->{&BLD_ENUM}; + my $rhFileDeclare = $rhFile->{&BLD_DECLARE}; my $rhFileData = $rhFile->{&BLD_DATA}; my $rhSource; @@ -57,7 +58,7 @@ sub buildAll # Build header file #------------------------------------------------------------------------------------------------------------------------------- - if (defined($rhFileEnum) || defined($rhFileConstant)) + if (defined($rhFileEnum) || defined($rhFileConstant) || defined($rhFileDeclare)) { my $strHeaderDefine = uc("${strPath}/${strFile}") . '_AUTO_H'; $strHeaderDefine =~ s/\//_/g; @@ -99,7 +100,7 @@ sub buildAll my $iExpectedValue = 0; - # Iterate constants + # Iterate enums foreach my $strEnumItem (@{$rhEnum->{&BLD_LIST}}) { $strHeader .= @@ -119,6 +120,14 @@ sub buildAll "} " . $rhEnum->{&BLD_NAME} . ";\n"; } + foreach my $strDeclare (sort(keys(%{$rhFileDeclare}))) + { + my $rhDeclare = $rhFileDeclare->{$strDeclare}; + + $strHeader .= "\n" . bldBanner($rhDeclare->{&BLD_SUMMARY}); + $strHeader .= $rhDeclare->{&BLD_SOURCE}; + } + $strHeader .= "\n#endif"; diff --git a/build/lib/pgBackRestBuild/Build/Common.pm b/build/lib/pgBackRestBuild/Build/Common.pm index 045376a4d..d55299db5 100644 --- a/build/lib/pgBackRestBuild/Build/Common.pm +++ b/build/lib/pgBackRestBuild/Build/Common.pm @@ -42,6 +42,8 @@ use constant BLD_CONSTANT_VALUE => 'constant use constant BLD_DATA => 'data'; push @EXPORT, qw(BLD_DATA); +use constant BLD_DECLARE => 'declare'; + push @EXPORT, qw(BLD_DECLARE); use constant BLD_ENUM => 'enum'; push @EXPORT, qw(BLD_ENUM); use constant BLD_LIST => 'list'; diff --git a/build/lib/pgBackRestBuild/Error/Build.pm b/build/lib/pgBackRestBuild/Error/Build.pm new file mode 100644 index 000000000..3a2622676 --- /dev/null +++ b/build/lib/pgBackRestBuild/Error/Build.pm @@ -0,0 +1,136 @@ +#################################################################################################################################### +# Auto-Generate Error Mappings +#################################################################################################################################### +package pgBackRestBuild::Error::Build; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); +use English '-no_match_vars'; + +use Exporter qw(import); + our @EXPORT = qw(); + +use pgBackRestBuild::Build::Common; +use pgBackRestBuild::Error::Data; + +use pgBackRest::Common::Log; + +#################################################################################################################################### +# Constants +#################################################################################################################################### +use constant BLDLCL_FILE_DEFINE => 'error'; + +use constant BLDLCL_DATA_ERROR => '01-dataError'; +use constant BLDLCL_DATA_ERROR_ARRAY => '01-dataErrorArray'; + +#################################################################################################################################### +# Definitions for constants and data to build +#################################################################################################################################### +my $strSummary = 'Error Type Definition'; + +my $rhBuild = +{ + &BLD_FILE => + { + &BLDLCL_FILE_DEFINE => + { + &BLD_SUMMARY => $strSummary, + + &BLD_DECLARE => + { + &BLDLCL_DATA_ERROR => + { + &BLD_SUMMARY => 'Error type declarations', + }, + }, + + &BLD_DATA => + { + &BLDLCL_DATA_ERROR => + { + &BLD_SUMMARY => 'Error type definitions', + }, + + &BLDLCL_DATA_ERROR_ARRAY => + { + &BLD_SUMMARY => 'Error type array', + }, + }, + }, + }, +}; + +#################################################################################################################################### +# Build configuration constants and data +#################################################################################################################################### +sub buildError +{ + # Build error list + #------------------------------------------------------------------------------------------------------------------------------- + my $rhErrorDefine = errorDefine(); + + # Order by id for the list that is id ordered + my $rhErrorId = {}; + + foreach my $strType (sort(keys(%{$rhErrorDefine}))) + { + my $iCode = $rhErrorDefine->{$strType}; + + if (defined($rhErrorId->{$iCode})) + { + confess &log(ERROR, "error code ${iCode} is by '" . $rhErrorId->{$iCode} . "' and '${strType}'"); + } + + $rhErrorId->{$iCode} = $strType; + } + + # Output errors + my $strBuildSource; + + foreach my $iCode (sort({sprintf("%03d", $a) cmp sprintf("%03d", $b)} keys(%{$rhErrorId}))) + { + my $strType = $rhErrorId->{$iCode}; + + $strBuildSource .= + "ERROR_DECLARE(" . bldEnum("", $strType, true) . "Error);\n"; + } + + $rhBuild->{&BLD_FILE}{&BLDLCL_FILE_DEFINE}{&BLD_DECLARE}{&BLDLCL_DATA_ERROR}{&BLD_SOURCE} = $strBuildSource; + + # Output error definition data + $strBuildSource = undef; + + foreach my $iCode (sort({sprintf("%03d", $a) cmp sprintf("%03d", $b)} keys(%{$rhErrorId}))) + { + my $strType = $rhErrorId->{$iCode}; + + $strBuildSource .= + "ERROR_DEFINE(" . (' ' x (3 - length($iCode))) . "${iCode}, " . bldEnum("", $strType, true) . "Error, RuntimeError);\n"; + } + + $rhBuild->{&BLD_FILE}{&BLDLCL_FILE_DEFINE}{&BLD_DATA}{&BLDLCL_DATA_ERROR}{&BLD_SOURCE} = $strBuildSource; + + # Output error array + $strBuildSource = + "static const ErrorType *errorTypeList[] =\n" . + "{\n"; + + foreach my $iCode (sort({sprintf("%03d", $a) cmp sprintf("%03d", $b)} keys(%{$rhErrorId}))) + { + $strBuildSource .= + " &" . bldEnum("", $rhErrorId->{$iCode}, true) . "Error,\n"; + } + + $strBuildSource .= + " NULL,\n" . + "};"; + + $rhBuild->{&BLD_FILE}{&BLDLCL_FILE_DEFINE}{&BLD_DATA}{&BLDLCL_DATA_ERROR_ARRAY}{&BLD_SOURCE} = $strBuildSource; + + return $rhBuild; +} + +push @EXPORT, qw(buildError); + +1; diff --git a/build/lib/pgBackRestBuild/Error/Data.pm b/build/lib/pgBackRestBuild/Error/Data.pm new file mode 100644 index 000000000..93cced4c1 --- /dev/null +++ b/build/lib/pgBackRestBuild/Error/Data.pm @@ -0,0 +1,52 @@ +#################################################################################################################################### +# Error Definition Data +#################################################################################################################################### +package pgBackRestBuild::Error::Data; + +use strict; +use warnings FATAL => qw(all); +use Carp qw(confess); + +use Exporter qw(import); + our @EXPORT = qw(); +use Storable qw(dclone); + +#################################################################################################################################### +# Error min and max values +#################################################################################################################################### +use constant ERRDEF_MIN => 25; + push @EXPORT, qw(ERRDEF_MIN); +use constant ERRDEF_MAX => 125; + push @EXPORT, qw(ERRDEF_MAX); + +#################################################################################################################################### +# Error definition data +#################################################################################################################################### +my $rhErrorDefine; + +#################################################################################################################################### +# Load error definition from YAML +#################################################################################################################################### +sub errorDefineLoad +{ + my $strErrorYaml = shift; + + require YAML; + YAML->import(qw(Dump Load)); + + $rhErrorDefine = Load($strErrorYaml); +} + +push @EXPORT, qw(errorDefineLoad); + +#################################################################################################################################### +# Get error definition +#################################################################################################################################### +sub errorDefine +{ + return dclone($rhErrorDefine); +} + +push @EXPORT, qw(errorDefine); + +1; diff --git a/doc/xml/release.xml b/doc/xml/release.xml index c6aeb93a3..ea263ee1c 100644 --- a/doc/xml/release.xml +++ b/doc/xml/release.xml @@ -132,6 +132,10 @@

Improve error module. Add functions to convert error codes to C errors and handle system errors.

+ +

Create a master list of errors in build/error.yaml. The C and Perl errors lists are created automatically by Build.pm so they stay up to date.

+
+

Move lock release later in exitSafe() to reduce the chance of a new process starting and acquiring a lock before the old process has exited.

diff --git a/lib/pgBackRest/Common/Exception.pm b/lib/pgBackRest/Common/Exception.pm index 54ff856e7..1005fd6c8 100644 --- a/lib/pgBackRest/Common/Exception.pm +++ b/lib/pgBackRest/Common/Exception.pm @@ -12,163 +12,12 @@ use Scalar::Util qw(blessed); use Exporter qw(import); our @EXPORT = qw(); -#################################################################################################################################### -# Exception codes -#################################################################################################################################### -use constant ERROR_MINIMUM => 25; - push @EXPORT, qw(ERROR_MINIMUM); -use constant ERROR_MAXIMUM => 125; - push @EXPORT, qw(ERROR_MAXIMUM); +use pgBackRest::Common::ExceptionAuto; -use constant ERROR_ASSERT => ERROR_MINIMUM; - push @EXPORT, qw(ERROR_ASSERT); -use constant ERROR_CHECKSUM => ERROR_MINIMUM + 1; - push @EXPORT, qw(ERROR_CHECKSUM); -use constant ERROR_CONFIG => ERROR_MINIMUM + 2; - push @EXPORT, qw(ERROR_CONFIG); -use constant ERROR_FILE_INVALID => ERROR_MINIMUM + 3; - push @EXPORT, qw(ERROR_FILE_INVALID); -use constant ERROR_FORMAT => ERROR_MINIMUM + 4; - push @EXPORT, qw(ERROR_FORMAT); -use constant ERROR_COMMAND_REQUIRED => ERROR_MINIMUM + 5; - push @EXPORT, qw(ERROR_COMMAND_REQUIRED); -use constant ERROR_OPTION_INVALID => ERROR_MINIMUM + 6; - push @EXPORT, qw(ERROR_OPTION_INVALID); -use constant ERROR_OPTION_INVALID_VALUE => ERROR_MINIMUM + 7; - push @EXPORT, qw(ERROR_OPTION_INVALID_VALUE); -use constant ERROR_OPTION_INVALID_RANGE => ERROR_MINIMUM + 8; - push @EXPORT, qw(ERROR_OPTION_INVALID_RANGE); -use constant ERROR_OPTION_INVALID_PAIR => ERROR_MINIMUM + 9; - push @EXPORT, qw(ERROR_OPTION_INVALID_PAIR); -use constant ERROR_OPTION_DUPLICATE_KEY => ERROR_MINIMUM + 10; - push @EXPORT, qw(ERROR_OPTION_DUPLICATE_KEY); -use constant ERROR_OPTION_NEGATE => ERROR_MINIMUM + 11; - push @EXPORT, qw(ERROR_OPTION_NEGATE); -use constant ERROR_OPTION_REQUIRED => ERROR_MINIMUM + 12; - push @EXPORT, qw(ERROR_OPTION_REQUIRED); -use constant ERROR_POSTMASTER_RUNNING => ERROR_MINIMUM + 13; - push @EXPORT, qw(ERROR_POSTMASTER_RUNNING); -use constant ERROR_PROTOCOL => ERROR_MINIMUM + 14; - push @EXPORT, qw(ERROR_PROTOCOL); -use constant ERROR_PATH_NOT_EMPTY => ERROR_MINIMUM + 15; - push @EXPORT, qw(ERROR_PATH_NOT_EMPTY); -use constant ERROR_FILE_OPEN => ERROR_MINIMUM + 16; - push @EXPORT, qw(ERROR_FILE_OPEN); -use constant ERROR_FILE_READ => ERROR_MINIMUM + 17; - push @EXPORT, qw(ERROR_FILE_READ); -use constant ERROR_PARAM_REQUIRED => ERROR_MINIMUM + 18; - push @EXPORT, qw(ERROR_PARAM_REQUIRED); -use constant ERROR_ARCHIVE_MISMATCH => ERROR_MINIMUM + 19; - push @EXPORT, qw(ERROR_ARCHIVE_MISMATCH); -use constant ERROR_ARCHIVE_DUPLICATE => ERROR_MINIMUM + 20; - push @EXPORT, qw(ERROR_ARCHIVE_DUPLICATE); -use constant ERROR_VERSION_NOT_SUPPORTED => ERROR_MINIMUM + 21; - push @EXPORT, qw(ERROR_VERSION_NOT_SUPPORTED); -use constant ERROR_PATH_CREATE => ERROR_MINIMUM + 22; - push @EXPORT, qw(ERROR_PATH_CREATE); -use constant ERROR_COMMAND_INVALID => ERROR_MINIMUM + 23; - push @EXPORT, qw(ERROR_COMMAND_INVALID); -use constant ERROR_HOST_CONNECT => ERROR_MINIMUM + 24; - push @EXPORT, qw(ERROR_HOST_CONNECT); -use constant ERROR_LOCK_ACQUIRE => ERROR_MINIMUM + 25; - push @EXPORT, qw(ERROR_LOCK_ACQUIRE); -use constant ERROR_BACKUP_MISMATCH => ERROR_MINIMUM + 26; - push @EXPORT, qw(ERROR_BACKUP_MISMATCH); -use constant ERROR_FILE_SYNC => ERROR_MINIMUM + 27; - push @EXPORT, qw(ERROR_FILE_SYNC); -use constant ERROR_PATH_OPEN => ERROR_MINIMUM + 28; - push @EXPORT, qw(ERROR_PATH_OPEN); -use constant ERROR_PATH_SYNC => ERROR_MINIMUM + 29; - push @EXPORT, qw(ERROR_PATH_SYNC); -use constant ERROR_FILE_MISSING => ERROR_MINIMUM + 30; - push @EXPORT, qw(ERROR_FILE_MISSING); -use constant ERROR_DB_CONNECT => ERROR_MINIMUM + 31; - push @EXPORT, qw(ERROR_DB_CONNECT); -use constant ERROR_DB_QUERY => ERROR_MINIMUM + 32; - push @EXPORT, qw(ERROR_DB_QUERY); -use constant ERROR_DB_MISMATCH => ERROR_MINIMUM + 33; - push @EXPORT, qw(ERROR_DB_MISMATCH); -use constant ERROR_DB_TIMEOUT => ERROR_MINIMUM + 34; - push @EXPORT, qw(ERROR_DB_TIMEOUT); -use constant ERROR_FILE_REMOVE => ERROR_MINIMUM + 35; - push @EXPORT, qw(ERROR_FILE_REMOVE); -use constant ERROR_PATH_REMOVE => ERROR_MINIMUM + 36; - push @EXPORT, qw(ERROR_PATH_REMOVE); -use constant ERROR_STOP => ERROR_MINIMUM + 37; - push @EXPORT, qw(ERROR_STOP); -use constant ERROR_TERM => ERROR_MINIMUM + 38; - push @EXPORT, qw(ERROR_TERM); -use constant ERROR_FILE_WRITE => ERROR_MINIMUM + 39; - push @EXPORT, qw(ERROR_FILE_WRITE); -use constant ERROR_PROTOCOL_TIMEOUT => ERROR_MINIMUM + 41; - push @EXPORT, qw(ERROR_PROTOCOL_TIMEOUT); -use constant ERROR_FEATURE_NOT_SUPPORTED => ERROR_MINIMUM + 42; - push @EXPORT, qw(ERROR_FEATURE_NOT_SUPPORTED); -use constant ERROR_ARCHIVE_COMMAND_INVALID => ERROR_MINIMUM + 43; - push @EXPORT, qw(ERROR_ARCHIVE_COMMAND_INVALID); -use constant ERROR_LINK_EXPECTED => ERROR_MINIMUM + 44; - push @EXPORT, qw(ERROR_LINK_EXPECTED); -use constant ERROR_LINK_DESTINATION => ERROR_MINIMUM + 45; - push @EXPORT, qw(ERROR_LINK_DESTINATION); -use constant ERROR_TABLESPACE_IN_PGDATA => ERROR_MINIMUM + 46; - push @EXPORT, qw(ERROR_TABLESPACE_IN_PGDATA); -use constant ERROR_HOST_INVALID => ERROR_MINIMUM + 47; - push @EXPORT, qw(ERROR_HOST_INVALID); -use constant ERROR_PATH_MISSING => ERROR_MINIMUM + 48; - push @EXPORT, qw(ERROR_PATH_MISSING); -use constant ERROR_FILE_MOVE => ERROR_MINIMUM + 49; - push @EXPORT, qw(ERROR_FILE_MOVE); -use constant ERROR_BACKUP_SET_INVALID => ERROR_MINIMUM + 50; - push @EXPORT, qw(ERROR_BACKUP_SET_INVALID); -use constant ERROR_TABLESPACE_MAP => ERROR_MINIMUM + 51; - push @EXPORT, qw(ERROR_TABLESPACE_MAP); -use constant ERROR_PATH_TYPE => ERROR_MINIMUM + 52; - push @EXPORT, qw(ERROR_PATH_TYPE); -use constant ERROR_LINK_MAP => ERROR_MINIMUM + 53; - push @EXPORT, qw(ERROR_LINK_MAP); -use constant ERROR_FILE_CLOSE => ERROR_MINIMUM + 54; - push @EXPORT, qw(ERROR_FILE_CLOSE); -use constant ERROR_DB_MISSING => ERROR_MINIMUM + 55; - push @EXPORT, qw(ERROR_DB_MISSING); -use constant ERROR_DB_INVALID => ERROR_MINIMUM + 56; - push @EXPORT, qw(ERROR_DB_INVALID); -use constant ERROR_ARCHIVE_TIMEOUT => ERROR_MINIMUM + 57; - push @EXPORT, qw(ERROR_ARCHIVE_TIMEOUT); -use constant ERROR_FILE_MODE => ERROR_MINIMUM + 58; - push @EXPORT, qw(ERROR_FILE_MODE); -use constant ERROR_OPTION_MULTIPLE_VALUE => ERROR_MINIMUM + 59; - push @EXPORT, qw(ERROR_OPTION_MULTIPLE_VALUE); -use constant ERROR_PROTOCOL_OUTPUT_REQUIRED => ERROR_MINIMUM + 60; - push @EXPORT, qw(ERROR_PROTOCOL_OUTPUT_REQUIRED); -use constant ERROR_LINK_OPEN => ERROR_MINIMUM + 61; - push @EXPORT, qw(ERROR_LINK_OPEN); -use constant ERROR_ARCHIVE_DISABLED => ERROR_MINIMUM + 62; - push @EXPORT, qw(ERROR_ARCHIVE_DISABLED); -use constant ERROR_FILE_OWNER => ERROR_MINIMUM + 63; - push @EXPORT, qw(ERROR_FILE_OWNER); -use constant ERROR_USER_MISSING => ERROR_MINIMUM + 64; - push @EXPORT, qw(ERROR_USER_MISSING); -use constant ERROR_OPTION_COMMAND => ERROR_MINIMUM + 65; - push @EXPORT, qw(ERROR_OPTION_COMMAND); -use constant ERROR_GROUP_MISSING => ERROR_MINIMUM + 66; - push @EXPORT, qw(ERROR_GROUP_MISSING); -use constant ERROR_PATH_EXISTS => ERROR_MINIMUM + 67; - push @EXPORT, qw(ERROR_PATH_EXISTS); -use constant ERROR_FILE_EXISTS => ERROR_MINIMUM + 68; - push @EXPORT, qw(ERROR_FILE_EXISTS); -use constant ERROR_MEMORY => ERROR_MINIMUM + 69; # Thrown by C library - push @EXPORT, qw(ERROR_MEMORY); -use constant ERROR_CIPHER => ERROR_MINIMUM + 70; - push @EXPORT, qw(ERROR_CIPHER); -use constant ERROR_PARAM_INVALID => ERROR_MINIMUM + 71; - push @EXPORT, qw(ERROR_PARAM_INVALID); - -use constant ERROR_INVALID_VALUE => ERROR_MAXIMUM - 2; - push @EXPORT, qw(ERROR_INVALID_VALUE); -use constant ERROR_UNHANDLED => ERROR_MAXIMUM - 1; - push @EXPORT, qw(ERROR_UNHANDLED); -use constant ERROR_UNKNOWN => ERROR_MAXIMUM; - push @EXPORT, qw(ERROR_UNKNOWN); +#################################################################################################################################### +# Export error constants +#################################################################################################################################### +push(@EXPORT, @pgBackRest::Common::ExceptionAuto::EXPORT); #################################################################################################################################### # CONSTRUCTOR @@ -184,7 +33,7 @@ sub new if ($iCode < ERROR_MINIMUM || $iCode > ERROR_MAXIMUM) { - $iCode = ERROR_INVALID_VALUE; + $iCode = ERROR_INVALID; } # Create the class hash diff --git a/lib/pgBackRest/Common/ExceptionAuto.pm b/lib/pgBackRest/Common/ExceptionAuto.pm new file mode 100644 index 000000000..ea7307894 --- /dev/null +++ b/lib/pgBackRest/Common/ExceptionAuto.pm @@ -0,0 +1,173 @@ +#################################################################################################################################### +# COMMON EXCEPTION AUTO MODULE +# +# Automatically generated by Build.pm -- do not modify directly. +#################################################################################################################################### +package pgBackRest::Common::ExceptionAuto; + +use strict; +use warnings FATAL => qw(all); + +use Exporter qw(import); + our @EXPORT = qw(); + +#################################################################################################################################### +# Error Definitions +#################################################################################################################################### +use constant ERROR_MINIMUM => 25; +push @EXPORT, qw(ERROR_MINIMUM); +use constant ERROR_MAXIMUM => 125; +push @EXPORT, qw(ERROR_MAXIMUM); + +use constant ERROR_ASSERT => 25; +push @EXPORT, qw(ERROR_ASSERT); +use constant ERROR_CHECKSUM => 26; +push @EXPORT, qw(ERROR_CHECKSUM); +use constant ERROR_CONFIG => 27; +push @EXPORT, qw(ERROR_CONFIG); +use constant ERROR_FILE_INVALID => 28; +push @EXPORT, qw(ERROR_FILE_INVALID); +use constant ERROR_FORMAT => 29; +push @EXPORT, qw(ERROR_FORMAT); +use constant ERROR_COMMAND_REQUIRED => 30; +push @EXPORT, qw(ERROR_COMMAND_REQUIRED); +use constant ERROR_OPTION_INVALID => 31; +push @EXPORT, qw(ERROR_OPTION_INVALID); +use constant ERROR_OPTION_INVALID_VALUE => 32; +push @EXPORT, qw(ERROR_OPTION_INVALID_VALUE); +use constant ERROR_OPTION_INVALID_RANGE => 33; +push @EXPORT, qw(ERROR_OPTION_INVALID_RANGE); +use constant ERROR_OPTION_INVALID_PAIR => 34; +push @EXPORT, qw(ERROR_OPTION_INVALID_PAIR); +use constant ERROR_OPTION_DUPLICATE_KEY => 35; +push @EXPORT, qw(ERROR_OPTION_DUPLICATE_KEY); +use constant ERROR_OPTION_NEGATE => 36; +push @EXPORT, qw(ERROR_OPTION_NEGATE); +use constant ERROR_OPTION_REQUIRED => 37; +push @EXPORT, qw(ERROR_OPTION_REQUIRED); +use constant ERROR_POSTMASTER_RUNNING => 38; +push @EXPORT, qw(ERROR_POSTMASTER_RUNNING); +use constant ERROR_PROTOCOL => 39; +push @EXPORT, qw(ERROR_PROTOCOL); +use constant ERROR_PATH_NOT_EMPTY => 40; +push @EXPORT, qw(ERROR_PATH_NOT_EMPTY); +use constant ERROR_FILE_OPEN => 41; +push @EXPORT, qw(ERROR_FILE_OPEN); +use constant ERROR_FILE_READ => 42; +push @EXPORT, qw(ERROR_FILE_READ); +use constant ERROR_PARAM_REQUIRED => 43; +push @EXPORT, qw(ERROR_PARAM_REQUIRED); +use constant ERROR_ARCHIVE_MISMATCH => 44; +push @EXPORT, qw(ERROR_ARCHIVE_MISMATCH); +use constant ERROR_ARCHIVE_DUPLICATE => 45; +push @EXPORT, qw(ERROR_ARCHIVE_DUPLICATE); +use constant ERROR_VERSION_NOT_SUPPORTED => 46; +push @EXPORT, qw(ERROR_VERSION_NOT_SUPPORTED); +use constant ERROR_PATH_CREATE => 47; +push @EXPORT, qw(ERROR_PATH_CREATE); +use constant ERROR_COMMAND_INVALID => 48; +push @EXPORT, qw(ERROR_COMMAND_INVALID); +use constant ERROR_HOST_CONNECT => 49; +push @EXPORT, qw(ERROR_HOST_CONNECT); +use constant ERROR_LOCK_ACQUIRE => 50; +push @EXPORT, qw(ERROR_LOCK_ACQUIRE); +use constant ERROR_BACKUP_MISMATCH => 51; +push @EXPORT, qw(ERROR_BACKUP_MISMATCH); +use constant ERROR_FILE_SYNC => 52; +push @EXPORT, qw(ERROR_FILE_SYNC); +use constant ERROR_PATH_OPEN => 53; +push @EXPORT, qw(ERROR_PATH_OPEN); +use constant ERROR_PATH_SYNC => 54; +push @EXPORT, qw(ERROR_PATH_SYNC); +use constant ERROR_FILE_MISSING => 55; +push @EXPORT, qw(ERROR_FILE_MISSING); +use constant ERROR_DB_CONNECT => 56; +push @EXPORT, qw(ERROR_DB_CONNECT); +use constant ERROR_DB_QUERY => 57; +push @EXPORT, qw(ERROR_DB_QUERY); +use constant ERROR_DB_MISMATCH => 58; +push @EXPORT, qw(ERROR_DB_MISMATCH); +use constant ERROR_DB_TIMEOUT => 59; +push @EXPORT, qw(ERROR_DB_TIMEOUT); +use constant ERROR_FILE_REMOVE => 60; +push @EXPORT, qw(ERROR_FILE_REMOVE); +use constant ERROR_PATH_REMOVE => 61; +push @EXPORT, qw(ERROR_PATH_REMOVE); +use constant ERROR_STOP => 62; +push @EXPORT, qw(ERROR_STOP); +use constant ERROR_TERM => 63; +push @EXPORT, qw(ERROR_TERM); +use constant ERROR_FILE_WRITE => 64; +push @EXPORT, qw(ERROR_FILE_WRITE); +use constant ERROR_PROTOCOL_TIMEOUT => 66; +push @EXPORT, qw(ERROR_PROTOCOL_TIMEOUT); +use constant ERROR_FEATURE_NOT_SUPPORTED => 67; +push @EXPORT, qw(ERROR_FEATURE_NOT_SUPPORTED); +use constant ERROR_ARCHIVE_COMMAND_INVALID => 68; +push @EXPORT, qw(ERROR_ARCHIVE_COMMAND_INVALID); +use constant ERROR_LINK_EXPECTED => 69; +push @EXPORT, qw(ERROR_LINK_EXPECTED); +use constant ERROR_LINK_DESTINATION => 70; +push @EXPORT, qw(ERROR_LINK_DESTINATION); +use constant ERROR_TABLESPACE_IN_PGDATA => 71; +push @EXPORT, qw(ERROR_TABLESPACE_IN_PGDATA); +use constant ERROR_HOST_INVALID => 72; +push @EXPORT, qw(ERROR_HOST_INVALID); +use constant ERROR_PATH_MISSING => 73; +push @EXPORT, qw(ERROR_PATH_MISSING); +use constant ERROR_FILE_MOVE => 74; +push @EXPORT, qw(ERROR_FILE_MOVE); +use constant ERROR_BACKUP_SET_INVALID => 75; +push @EXPORT, qw(ERROR_BACKUP_SET_INVALID); +use constant ERROR_TABLESPACE_MAP => 76; +push @EXPORT, qw(ERROR_TABLESPACE_MAP); +use constant ERROR_PATH_TYPE => 77; +push @EXPORT, qw(ERROR_PATH_TYPE); +use constant ERROR_LINK_MAP => 78; +push @EXPORT, qw(ERROR_LINK_MAP); +use constant ERROR_FILE_CLOSE => 79; +push @EXPORT, qw(ERROR_FILE_CLOSE); +use constant ERROR_DB_MISSING => 80; +push @EXPORT, qw(ERROR_DB_MISSING); +use constant ERROR_DB_INVALID => 81; +push @EXPORT, qw(ERROR_DB_INVALID); +use constant ERROR_ARCHIVE_TIMEOUT => 82; +push @EXPORT, qw(ERROR_ARCHIVE_TIMEOUT); +use constant ERROR_FILE_MODE => 83; +push @EXPORT, qw(ERROR_FILE_MODE); +use constant ERROR_OPTION_MULTIPLE_VALUE => 84; +push @EXPORT, qw(ERROR_OPTION_MULTIPLE_VALUE); +use constant ERROR_PROTOCOL_OUTPUT_REQUIRED => 85; +push @EXPORT, qw(ERROR_PROTOCOL_OUTPUT_REQUIRED); +use constant ERROR_LINK_OPEN => 86; +push @EXPORT, qw(ERROR_LINK_OPEN); +use constant ERROR_ARCHIVE_DISABLED => 87; +push @EXPORT, qw(ERROR_ARCHIVE_DISABLED); +use constant ERROR_FILE_OWNER => 88; +push @EXPORT, qw(ERROR_FILE_OWNER); +use constant ERROR_USER_MISSING => 89; +push @EXPORT, qw(ERROR_USER_MISSING); +use constant ERROR_OPTION_COMMAND => 90; +push @EXPORT, qw(ERROR_OPTION_COMMAND); +use constant ERROR_GROUP_MISSING => 91; +push @EXPORT, qw(ERROR_GROUP_MISSING); +use constant ERROR_PATH_EXISTS => 92; +push @EXPORT, qw(ERROR_PATH_EXISTS); +use constant ERROR_FILE_EXISTS => 93; +push @EXPORT, qw(ERROR_FILE_EXISTS); +use constant ERROR_MEMORY => 94; +push @EXPORT, qw(ERROR_MEMORY); +use constant ERROR_CIPHER => 95; +push @EXPORT, qw(ERROR_CIPHER); +use constant ERROR_PARAM_INVALID => 96; +push @EXPORT, qw(ERROR_PARAM_INVALID); +use constant ERROR_RUNTIME => 122; +push @EXPORT, qw(ERROR_RUNTIME); +use constant ERROR_INVALID => 123; +push @EXPORT, qw(ERROR_INVALID); +use constant ERROR_UNHANDLED => 124; +push @EXPORT, qw(ERROR_UNHANDLED); +use constant ERROR_UNKNOWN => 125; +push @EXPORT, qw(ERROR_UNKNOWN); + +1; diff --git a/libc/Makefile.PL b/libc/Makefile.PL index 0404bd6d5..276f69a48 100644 --- a/libc/Makefile.PL +++ b/libc/Makefile.PL @@ -80,7 +80,6 @@ my @stryCFile = 'common/encode.c', 'common/encode/base64.c', 'common/error.c', - 'common/errorType.c', 'common/ini.c', 'common/log.c', 'common/memContext.c', diff --git a/libc/build/lib/pgBackRestLibC/Build.pm b/libc/build/lib/pgBackRestLibC/Build.pm index f00824599..c96eb841e 100644 --- a/libc/build/lib/pgBackRestLibC/Build.pm +++ b/libc/build/lib/pgBackRestLibC/Build.pm @@ -26,6 +26,7 @@ use pgBackRest::Version; use pgBackRestBuild::Build; use pgBackRestBuild::Build::Common; +use pgBackRestBuild::Error::Data; use pgBackRestLibC::Config::Build; use pgBackRestLibC::Config::BuildDefine; @@ -314,6 +315,59 @@ sub buildXsAll { $oStorage->put($strLibFile, $strContent); } + + # Build error file + #------------------------------------------------------------------------------------------------------------------------------- + my $rhErrorDefine = errorDefine(); + + # Order by id for the list that is id ordered + my $rhErrorId = {}; + + foreach my $strType (sort(keys(%{$rhErrorDefine}))) + { + my $iCode = $rhErrorDefine->{$strType}; + $rhErrorId->{$iCode} = $strType; + } + + # Output errors + $strContent = + ('#' x 132) . "\n" . + "# COMMON EXCEPTION AUTO MODULE\n" . + "# \n" . + '# ' . bldAutoWarning('Build.pm') . "\n" . + ('#' x 132) . "\n" . + "package pgBackRest::Common::ExceptionAuto;\n" . + "\n" . + "use strict;\n" . + "use warnings FATAL => qw(all);\n" . + "\n" . + "use Exporter qw(import);\n" . + " our \@EXPORT = qw();\n" . + "\n" . + ('#' x 132) . "\n" . + "# Error Definitions\n" . + ('#' x 132) . "\n" . + "use constant ERROR_MINIMUM => " . ERRDEF_MIN . ";\n" . + "push \@EXPORT, qw(ERROR_MINIMUM);\n" . + "use constant ERROR_MAXIMUM => " . ERRDEF_MAX . ";\n" . + "push \@EXPORT, qw(ERROR_MAXIMUM);\n" . + "\n"; + + foreach my $iCode (sort({sprintf("%03d", $a) cmp sprintf("%03d", $b)} keys(%{$rhErrorId}))) + { + my $strType = "ERROR_" . uc($rhErrorId->{$iCode}); + $strType =~ s/\-/\_/g; + + $strContent .= + "use constant ${strType}" . (' ' x (54 - length($strType))) . " => $iCode;\n" . + "push \@EXPORT, qw(${strType});\n" + } + + $strContent .= + "\n" . + "1;\n"; + + $oStorage->put('../lib/' . BACKREST_NAME . '/Common/ExceptionAuto.pm', $strContent); } push @EXPORT, qw(buildXsAll); diff --git a/src/Makefile b/src/Makefile index ce6cb2c78..5104ee08c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -7,7 +7,6 @@ pgbackrest: \ command/help/help.o \ command/command.o \ common/error.o \ - common/errorType.o \ common/exit.o \ common/ini.o \ common/log.o \ @@ -35,7 +34,6 @@ pgbackrest: \ command/help/help.o \ command/command.o \ common/error.o \ - common/errorType.o \ common/exit.o \ common/ini.o \ common/log.o \ diff --git a/src/cipher/block.c b/src/cipher/block.c index 97739e90f..b03d3007a 100644 --- a/src/cipher/block.c +++ b/src/cipher/block.c @@ -6,7 +6,6 @@ Block Cipher #include #include -#include "common/errorType.h" #include "common/memContext.h" #include "cipher/block.h" #include "cipher/random.h" diff --git a/src/common/error.auto.c b/src/common/error.auto.c new file mode 100644 index 000000000..e136cb6df --- /dev/null +++ b/src/common/error.auto.c @@ -0,0 +1,167 @@ +/*********************************************************************************************************************************** +Error Type Definition + +Automatically generated by Build.pm -- do not modify directly. +***********************************************************************************************************************************/ + +/*********************************************************************************************************************************** +Error type definitions +***********************************************************************************************************************************/ +ERROR_DEFINE( 25, AssertError, RuntimeError); +ERROR_DEFINE( 26, ChecksumError, RuntimeError); +ERROR_DEFINE( 27, ConfigError, RuntimeError); +ERROR_DEFINE( 28, FileInvalidError, RuntimeError); +ERROR_DEFINE( 29, FormatError, RuntimeError); +ERROR_DEFINE( 30, CommandRequiredError, RuntimeError); +ERROR_DEFINE( 31, OptionInvalidError, RuntimeError); +ERROR_DEFINE( 32, OptionInvalidValueError, RuntimeError); +ERROR_DEFINE( 33, OptionInvalidRangeError, RuntimeError); +ERROR_DEFINE( 34, OptionInvalidPairError, RuntimeError); +ERROR_DEFINE( 35, OptionDuplicateKeyError, RuntimeError); +ERROR_DEFINE( 36, OptionNegateError, RuntimeError); +ERROR_DEFINE( 37, OptionRequiredError, RuntimeError); +ERROR_DEFINE( 38, PostmasterRunningError, RuntimeError); +ERROR_DEFINE( 39, ProtocolError, RuntimeError); +ERROR_DEFINE( 40, PathNotEmptyError, RuntimeError); +ERROR_DEFINE( 41, FileOpenError, RuntimeError); +ERROR_DEFINE( 42, FileReadError, RuntimeError); +ERROR_DEFINE( 43, ParamRequiredError, RuntimeError); +ERROR_DEFINE( 44, ArchiveMismatchError, RuntimeError); +ERROR_DEFINE( 45, ArchiveDuplicateError, RuntimeError); +ERROR_DEFINE( 46, VersionNotSupportedError, RuntimeError); +ERROR_DEFINE( 47, PathCreateError, RuntimeError); +ERROR_DEFINE( 48, CommandInvalidError, RuntimeError); +ERROR_DEFINE( 49, HostConnectError, RuntimeError); +ERROR_DEFINE( 50, LockAcquireError, RuntimeError); +ERROR_DEFINE( 51, BackupMismatchError, RuntimeError); +ERROR_DEFINE( 52, FileSyncError, RuntimeError); +ERROR_DEFINE( 53, PathOpenError, RuntimeError); +ERROR_DEFINE( 54, PathSyncError, RuntimeError); +ERROR_DEFINE( 55, FileMissingError, RuntimeError); +ERROR_DEFINE( 56, DbConnectError, RuntimeError); +ERROR_DEFINE( 57, DbQueryError, RuntimeError); +ERROR_DEFINE( 58, DbMismatchError, RuntimeError); +ERROR_DEFINE( 59, DbTimeoutError, RuntimeError); +ERROR_DEFINE( 60, FileRemoveError, RuntimeError); +ERROR_DEFINE( 61, PathRemoveError, RuntimeError); +ERROR_DEFINE( 62, StopError, RuntimeError); +ERROR_DEFINE( 63, TermError, RuntimeError); +ERROR_DEFINE( 64, FileWriteError, RuntimeError); +ERROR_DEFINE( 66, ProtocolTimeoutError, RuntimeError); +ERROR_DEFINE( 67, FeatureNotSupportedError, RuntimeError); +ERROR_DEFINE( 68, ArchiveCommandInvalidError, RuntimeError); +ERROR_DEFINE( 69, LinkExpectedError, RuntimeError); +ERROR_DEFINE( 70, LinkDestinationError, RuntimeError); +ERROR_DEFINE( 71, TablespaceInPgdataError, RuntimeError); +ERROR_DEFINE( 72, HostInvalidError, RuntimeError); +ERROR_DEFINE( 73, PathMissingError, RuntimeError); +ERROR_DEFINE( 74, FileMoveError, RuntimeError); +ERROR_DEFINE( 75, BackupSetInvalidError, RuntimeError); +ERROR_DEFINE( 76, TablespaceMapError, RuntimeError); +ERROR_DEFINE( 77, PathTypeError, RuntimeError); +ERROR_DEFINE( 78, LinkMapError, RuntimeError); +ERROR_DEFINE( 79, FileCloseError, RuntimeError); +ERROR_DEFINE( 80, DbMissingError, RuntimeError); +ERROR_DEFINE( 81, DbInvalidError, RuntimeError); +ERROR_DEFINE( 82, ArchiveTimeoutError, RuntimeError); +ERROR_DEFINE( 83, FileModeError, RuntimeError); +ERROR_DEFINE( 84, OptionMultipleValueError, RuntimeError); +ERROR_DEFINE( 85, ProtocolOutputRequiredError, RuntimeError); +ERROR_DEFINE( 86, LinkOpenError, RuntimeError); +ERROR_DEFINE( 87, ArchiveDisabledError, RuntimeError); +ERROR_DEFINE( 88, FileOwnerError, RuntimeError); +ERROR_DEFINE( 89, UserMissingError, RuntimeError); +ERROR_DEFINE( 90, OptionCommandError, RuntimeError); +ERROR_DEFINE( 91, GroupMissingError, RuntimeError); +ERROR_DEFINE( 92, PathExistsError, RuntimeError); +ERROR_DEFINE( 93, FileExistsError, RuntimeError); +ERROR_DEFINE( 94, MemoryError, RuntimeError); +ERROR_DEFINE( 95, CipherError, RuntimeError); +ERROR_DEFINE( 96, ParamInvalidError, RuntimeError); +ERROR_DEFINE(122, RuntimeError, RuntimeError); +ERROR_DEFINE(123, InvalidError, RuntimeError); +ERROR_DEFINE(124, UnhandledError, RuntimeError); +ERROR_DEFINE(125, UnknownError, RuntimeError); + +/*********************************************************************************************************************************** +Error type array +***********************************************************************************************************************************/ +static const ErrorType *errorTypeList[] = +{ + &AssertError, + &ChecksumError, + &ConfigError, + &FileInvalidError, + &FormatError, + &CommandRequiredError, + &OptionInvalidError, + &OptionInvalidValueError, + &OptionInvalidRangeError, + &OptionInvalidPairError, + &OptionDuplicateKeyError, + &OptionNegateError, + &OptionRequiredError, + &PostmasterRunningError, + &ProtocolError, + &PathNotEmptyError, + &FileOpenError, + &FileReadError, + &ParamRequiredError, + &ArchiveMismatchError, + &ArchiveDuplicateError, + &VersionNotSupportedError, + &PathCreateError, + &CommandInvalidError, + &HostConnectError, + &LockAcquireError, + &BackupMismatchError, + &FileSyncError, + &PathOpenError, + &PathSyncError, + &FileMissingError, + &DbConnectError, + &DbQueryError, + &DbMismatchError, + &DbTimeoutError, + &FileRemoveError, + &PathRemoveError, + &StopError, + &TermError, + &FileWriteError, + &ProtocolTimeoutError, + &FeatureNotSupportedError, + &ArchiveCommandInvalidError, + &LinkExpectedError, + &LinkDestinationError, + &TablespaceInPgdataError, + &HostInvalidError, + &PathMissingError, + &FileMoveError, + &BackupSetInvalidError, + &TablespaceMapError, + &PathTypeError, + &LinkMapError, + &FileCloseError, + &DbMissingError, + &DbInvalidError, + &ArchiveTimeoutError, + &FileModeError, + &OptionMultipleValueError, + &ProtocolOutputRequiredError, + &LinkOpenError, + &ArchiveDisabledError, + &FileOwnerError, + &UserMissingError, + &OptionCommandError, + &GroupMissingError, + &PathExistsError, + &FileExistsError, + &MemoryError, + &CipherError, + &ParamInvalidError, + &RuntimeError, + &InvalidError, + &UnhandledError, + &UnknownError, + NULL, +}; diff --git a/src/common/error.auto.h b/src/common/error.auto.h new file mode 100644 index 000000000..369c11cf1 --- /dev/null +++ b/src/common/error.auto.h @@ -0,0 +1,88 @@ +/*********************************************************************************************************************************** +Error Type Definition + +Automatically generated by Build.pm -- do not modify directly. +***********************************************************************************************************************************/ +#ifndef COMMON_ERROR_AUTO_H +#define COMMON_ERROR_AUTO_H + +/*********************************************************************************************************************************** +Error type declarations +***********************************************************************************************************************************/ +ERROR_DECLARE(AssertError); +ERROR_DECLARE(ChecksumError); +ERROR_DECLARE(ConfigError); +ERROR_DECLARE(FileInvalidError); +ERROR_DECLARE(FormatError); +ERROR_DECLARE(CommandRequiredError); +ERROR_DECLARE(OptionInvalidError); +ERROR_DECLARE(OptionInvalidValueError); +ERROR_DECLARE(OptionInvalidRangeError); +ERROR_DECLARE(OptionInvalidPairError); +ERROR_DECLARE(OptionDuplicateKeyError); +ERROR_DECLARE(OptionNegateError); +ERROR_DECLARE(OptionRequiredError); +ERROR_DECLARE(PostmasterRunningError); +ERROR_DECLARE(ProtocolError); +ERROR_DECLARE(PathNotEmptyError); +ERROR_DECLARE(FileOpenError); +ERROR_DECLARE(FileReadError); +ERROR_DECLARE(ParamRequiredError); +ERROR_DECLARE(ArchiveMismatchError); +ERROR_DECLARE(ArchiveDuplicateError); +ERROR_DECLARE(VersionNotSupportedError); +ERROR_DECLARE(PathCreateError); +ERROR_DECLARE(CommandInvalidError); +ERROR_DECLARE(HostConnectError); +ERROR_DECLARE(LockAcquireError); +ERROR_DECLARE(BackupMismatchError); +ERROR_DECLARE(FileSyncError); +ERROR_DECLARE(PathOpenError); +ERROR_DECLARE(PathSyncError); +ERROR_DECLARE(FileMissingError); +ERROR_DECLARE(DbConnectError); +ERROR_DECLARE(DbQueryError); +ERROR_DECLARE(DbMismatchError); +ERROR_DECLARE(DbTimeoutError); +ERROR_DECLARE(FileRemoveError); +ERROR_DECLARE(PathRemoveError); +ERROR_DECLARE(StopError); +ERROR_DECLARE(TermError); +ERROR_DECLARE(FileWriteError); +ERROR_DECLARE(ProtocolTimeoutError); +ERROR_DECLARE(FeatureNotSupportedError); +ERROR_DECLARE(ArchiveCommandInvalidError); +ERROR_DECLARE(LinkExpectedError); +ERROR_DECLARE(LinkDestinationError); +ERROR_DECLARE(TablespaceInPgdataError); +ERROR_DECLARE(HostInvalidError); +ERROR_DECLARE(PathMissingError); +ERROR_DECLARE(FileMoveError); +ERROR_DECLARE(BackupSetInvalidError); +ERROR_DECLARE(TablespaceMapError); +ERROR_DECLARE(PathTypeError); +ERROR_DECLARE(LinkMapError); +ERROR_DECLARE(FileCloseError); +ERROR_DECLARE(DbMissingError); +ERROR_DECLARE(DbInvalidError); +ERROR_DECLARE(ArchiveTimeoutError); +ERROR_DECLARE(FileModeError); +ERROR_DECLARE(OptionMultipleValueError); +ERROR_DECLARE(ProtocolOutputRequiredError); +ERROR_DECLARE(LinkOpenError); +ERROR_DECLARE(ArchiveDisabledError); +ERROR_DECLARE(FileOwnerError); +ERROR_DECLARE(UserMissingError); +ERROR_DECLARE(OptionCommandError); +ERROR_DECLARE(GroupMissingError); +ERROR_DECLARE(PathExistsError); +ERROR_DECLARE(FileExistsError); +ERROR_DECLARE(MemoryError); +ERROR_DECLARE(CipherError); +ERROR_DECLARE(ParamInvalidError); +ERROR_DECLARE(RuntimeError); +ERROR_DECLARE(InvalidError); +ERROR_DECLARE(UnhandledError); +ERROR_DECLARE(UnknownError); + +#endif diff --git a/src/common/error.c b/src/common/error.c index 6d6ee6f68..88d77ebee 100644 --- a/src/common/error.c +++ b/src/common/error.c @@ -8,6 +8,23 @@ Error Handler #include "common/error.h" +/*********************************************************************************************************************************** +Represents an error type +***********************************************************************************************************************************/ +struct ErrorType +{ + const int code; + const char *name; + const struct ErrorType *parentType; +}; + +// Macro for defining new error types +#define ERROR_DEFINE(code, name, parentType) \ + const ErrorType name = {code, #name, &parentType} + +// Include error type definitions +#include "common/error.auto.c" + /*********************************************************************************************************************************** Maximum allowed number of nested try blocks ***********************************************************************************************************************************/ @@ -59,6 +76,75 @@ The temp buffer is required because the error message being passed might be the static char messageBuffer[ERROR_MESSAGE_BUFFER_SIZE]; static char messageBufferTemp[ERROR_MESSAGE_BUFFER_SIZE]; +/*********************************************************************************************************************************** +Error type code +***********************************************************************************************************************************/ +int +errorTypeCode(const ErrorType *errorType) +{ + return errorType->code; +} + +/*********************************************************************************************************************************** +Get error type using a code +***********************************************************************************************************************************/ +const ErrorType * +errorTypeFromCode(int code) +{ + // Search for error type by code + int errorTypeIdx = 0; + const ErrorType *result = errorTypeList[errorTypeIdx]; + + while (result != NULL) + { + if (result->code == code) + break; + + result = errorTypeList[++errorTypeIdx]; + } + + // Error if type was not found + if (result == NULL) + THROW(AssertError, "could not find error type for code '%d'", code); + + return result; +} + +/*********************************************************************************************************************************** +Error type name +***********************************************************************************************************************************/ +const char * +errorTypeName(const ErrorType *errorType) +{ + return errorType->name; +} + +/*********************************************************************************************************************************** +Error type parent +***********************************************************************************************************************************/ +const ErrorType * +errorTypeParent(const ErrorType *errorType) +{ + return errorType->parentType; +} + +/*********************************************************************************************************************************** +Does the child error type extend the parent error type? +***********************************************************************************************************************************/ +bool +errorTypeExtends(const ErrorType *child, const ErrorType *parent) +{ + // Search for the parent + for (; child && errorTypeParent(child) != child; child = (ErrorType *)errorTypeParent(child)) + { + if (errorTypeParent(child) == parent) + return true; + } + + // Parent was not found + return false; +} + /*********************************************************************************************************************************** Error type ***********************************************************************************************************************************/ diff --git a/src/common/error.h b/src/common/error.h index f23c24f7a..d12cc462f 100644 --- a/src/common/error.h +++ b/src/common/error.h @@ -39,11 +39,31 @@ IMPORTANT: Never call return from within any of the error-handling blocks. #include -#include "common/errorType.h" #include "common/type.h" /*********************************************************************************************************************************** -Error accessor functions +Error type object +***********************************************************************************************************************************/ +typedef struct ErrorType ErrorType; + +// Macro for declaring new error types +#define ERROR_DECLARE(name) \ + extern const ErrorType name + +// Include error type declarations +#include "common/error.auto.h" + +/*********************************************************************************************************************************** +Functions to get information about a generic error type +***********************************************************************************************************************************/ +int errorTypeCode(const ErrorType *errorType); +const ErrorType *errorTypeFromCode(int code); +const char *errorTypeName(const ErrorType *errorType); +const ErrorType *errorTypeParent(const ErrorType *errorType); +bool errorTypeExtends(const ErrorType *child, const ErrorType *parent); + +/*********************************************************************************************************************************** +Functions to get information about the current error ***********************************************************************************************************************************/ const ErrorType *errorType(); int errorCode(); diff --git a/src/common/errorType.c b/src/common/errorType.c deleted file mode 100644 index 5446c5577..000000000 --- a/src/common/errorType.c +++ /dev/null @@ -1,148 +0,0 @@ -/*********************************************************************************************************************************** -Application-Defined Errors -***********************************************************************************************************************************/ -#include "common/error.h" - -/*********************************************************************************************************************************** -Error code range -- chosen to not overlap with defined return values -***********************************************************************************************************************************/ -#define ERROR_CODE_MIN 25 -#define ERROR_CODE_MAX 125 - -/*********************************************************************************************************************************** -Represents an error type -***********************************************************************************************************************************/ -struct ErrorType -{ - const int code; - const char *name; - const struct ErrorType *parentType; -}; - -/*********************************************************************************************************************************** -Macro to create error structs -***********************************************************************************************************************************/ -#define ERROR_DEFINE(code, name, parentType) \ - const ErrorType name = {code, #name, &parentType} - -/*********************************************************************************************************************************** -Define errors -***********************************************************************************************************************************/ -ERROR_DEFINE(ERROR_CODE_MIN, AssertError, RuntimeError); - -ERROR_DEFINE(ERROR_CODE_MIN + 04, FormatError, RuntimeError); -ERROR_DEFINE(ERROR_CODE_MIN + 05, CommandRequiredError, FormatError); -ERROR_DEFINE(ERROR_CODE_MIN + 06, OptionInvalidError, RuntimeError); -ERROR_DEFINE(ERROR_CODE_MIN + 07, OptionInvalidValueError, RuntimeError); -ERROR_DEFINE(ERROR_CODE_MIN + 12, OptionRequiredError, RuntimeError); -ERROR_DEFINE(ERROR_CODE_MIN + 16, FileOpenError, RuntimeError); -ERROR_DEFINE(ERROR_CODE_MIN + 17, FileReadError, RuntimeError); -ERROR_DEFINE(ERROR_CODE_MIN + 18, ParamRequiredError, RuntimeError); -ERROR_DEFINE(ERROR_CODE_MIN + 19, ArchiveMismatchError, RuntimeError); -ERROR_DEFINE(ERROR_CODE_MIN + 23, CommandInvalidError, FormatError); -ERROR_DEFINE(ERROR_CODE_MIN + 28, PathOpenError, RuntimeError); -ERROR_DEFINE(ERROR_CODE_MIN + 39, FileWriteError, RuntimeError); -ERROR_DEFINE(ERROR_CODE_MIN + 57, ArchiveTimeoutError, RuntimeError); -ERROR_DEFINE(ERROR_CODE_MIN + 69, MemoryError, RuntimeError); -ERROR_DEFINE(ERROR_CODE_MIN + 70, CipherError, FormatError); -ERROR_DEFINE(ERROR_CODE_MIN + 71, ParamInvalidError, RuntimeError); - -ERROR_DEFINE(ERROR_CODE_MAX, RuntimeError, RuntimeError); - -/*********************************************************************************************************************************** -Place errors in an array so they can be found by code -***********************************************************************************************************************************/ -static const ErrorType *errorTypeList[] = -{ - &AssertError, - - &FormatError, - &CommandRequiredError, - &OptionInvalidError, - &OptionInvalidValueError, - &OptionRequiredError, - &FileOpenError, - &FileReadError, - &ParamRequiredError, - &ArchiveMismatchError, - &CommandInvalidError, - &PathOpenError, - &FileWriteError, - &ArchiveTimeoutError, - &MemoryError, - &CipherError, - &ParamInvalidError, - - &RuntimeError, - - NULL, -}; - -/*********************************************************************************************************************************** -Error type code -***********************************************************************************************************************************/ -int -errorTypeCode(const ErrorType *errorType) -{ - return errorType->code; -} - -/*********************************************************************************************************************************** -Get error type using a code -***********************************************************************************************************************************/ -const ErrorType * -errorTypeFromCode(int code) -{ - // Search for error type by code - int errorTypeIdx = 0; - const ErrorType *result = errorTypeList[errorTypeIdx]; - - while (result != NULL) - { - if (result->code == code) - break; - - result = errorTypeList[++errorTypeIdx]; - } - - // Error if type was not found - if (result == NULL) - THROW(AssertError, "could not find error type for code '%d'", code); - - return result; -} - -/*********************************************************************************************************************************** -Error type name -***********************************************************************************************************************************/ -const char * -errorTypeName(const ErrorType *errorType) -{ - return errorType->name; -} - -/*********************************************************************************************************************************** -Error type parent -***********************************************************************************************************************************/ -const ErrorType * -errorTypeParent(const ErrorType *errorType) -{ - return errorType->parentType; -} - -/*********************************************************************************************************************************** -Does the child error type extend the parent error type? -***********************************************************************************************************************************/ -bool -errorTypeExtends(const ErrorType *child, const ErrorType *parent) -{ - // Search for the parent - for (; child && errorTypeParent(child) != child; child = (ErrorType *)errorTypeParent(child)) - { - if (errorTypeParent(child) == parent) - return true; - } - - // Parent was not found - return false; -} diff --git a/src/common/errorType.h b/src/common/errorType.h deleted file mode 100644 index 4d5e6a2b3..000000000 --- a/src/common/errorType.h +++ /dev/null @@ -1,45 +0,0 @@ -/*********************************************************************************************************************************** -Application-Defined Errors -***********************************************************************************************************************************/ -#ifndef ERROR_TYPE_H -#define ERROR_TYPE_H - -#include "common/type.h" - -// Represents an error type -typedef struct ErrorType ErrorType; - -// Macros for declaring and defining new error types -#define ERROR_DECLARE(name) \ - extern const ErrorType name - -// Error types -ERROR_DECLARE(AssertError); - -ERROR_DECLARE(FormatError); -ERROR_DECLARE(CommandRequiredError); -ERROR_DECLARE(OptionInvalidError); -ERROR_DECLARE(OptionInvalidValueError); -ERROR_DECLARE(OptionRequiredError); -ERROR_DECLARE(FileOpenError); -ERROR_DECLARE(FileReadError); -ERROR_DECLARE(ParamRequiredError); -ERROR_DECLARE(ArchiveMismatchError); -ERROR_DECLARE(CommandInvalidError); -ERROR_DECLARE(PathOpenError); -ERROR_DECLARE(FileWriteError); -ERROR_DECLARE(ArchiveTimeoutError); -ERROR_DECLARE(MemoryError); -ERROR_DECLARE(CipherError); -ERROR_DECLARE(ParamInvalidError); - -ERROR_DECLARE(RuntimeError); - -// Functions -int errorTypeCode(const ErrorType *errorType); -const ErrorType *errorTypeFromCode(int code); -const char *errorTypeName(const ErrorType *errorType); -const ErrorType *errorTypeParent(const ErrorType *errorType); -bool errorTypeExtends(const ErrorType *child, const ErrorType *parent); - -#endif diff --git a/src/common/memContext.c b/src/common/memContext.c index dee630e85..98b8409a3 100644 --- a/src/common/memContext.c +++ b/src/common/memContext.c @@ -4,7 +4,7 @@ Memory Context Manager #include #include -#include "common/errorType.h" +#include "common/error.h" #include "common/memContext.h" /*********************************************************************************************************************************** diff --git a/src/common/type/variant.c b/src/common/type/variant.c index cd1e03360..475f2da2b 100644 --- a/src/common/type/variant.c +++ b/src/common/type/variant.c @@ -5,7 +5,6 @@ Variant Data Type #include #include -#include "common/errorType.h" #include "common/memContext.h" #include "common/type/variant.h" diff --git a/test/Vagrantfile b/test/Vagrantfile index cd87b3222..3a51a34f0 100644 --- a/test/Vagrantfile +++ b/test/Vagrantfile @@ -48,7 +48,7 @@ Vagrant.configure(2) do |config| #--------------------------------------------------------------------------------------------------------------------------- echo 'Install Perl Modules' && date apt-get install -y libdbd-pg-perl libio-socket-ssl-perl libxml-libxml-perl libxml-checker-perl libperl-critic-perl \ - libdevel-nytprof-perl + libdevel-nytprof-perl libyaml-perl #--------------------------------------------------------------------------------------------------------------------------- echo 'Install Build Tools' && date diff --git a/test/lib/pgBackRestTest/Common/CiTest.pm b/test/lib/pgBackRestTest/Common/CiTest.pm index d78cdae66..781d7ff6b 100644 --- a/test/lib/pgBackRestTest/Common/CiTest.pm +++ b/test/lib/pgBackRestTest/Common/CiTest.pm @@ -101,7 +101,7 @@ sub process "before_install:\n" . " - sudo apt-get -qq update && sudo apt-get install libxml-checker-perl libdbd-pg-perl libperl-critic-perl" . " libtemplate-perl libpod-coverage-perl libtest-differences-perl libhtml-parser-perl lintian debhelper txt2man" . - " devscripts libjson-perl libio-socket-ssl-perl libxml-libxml-perl python-pip\n" . + " devscripts libjson-perl libio-socket-ssl-perl libxml-libxml-perl libyaml-perl python-pip\n" . " - |\n" . " # Install & Configure AWS CLI\n" . " pip install --upgrade --user awscli\n" . diff --git a/test/lib/pgBackRestTest/Common/DefineTest.pm b/test/lib/pgBackRestTest/Common/DefineTest.pm index 14d3b5b42..db8d085cc 100644 --- a/test/lib/pgBackRestTest/Common/DefineTest.pm +++ b/test/lib/pgBackRestTest/Common/DefineTest.pm @@ -127,7 +127,7 @@ my $oTestDef = &TESTDEF_COVERAGE => { 'common/error' => TESTDEF_COVERAGE_FULL, - 'common/errorType' => TESTDEF_COVERAGE_FULL, + 'common/error.auto' => TESTDEF_COVERAGE_NOCODE, }, }, { diff --git a/test/src/module/common/exitTest.c b/test/src/module/common/exitTest.c index ee0fadf33..92e101171 100644 --- a/test/src/module/common/exitTest.c +++ b/test/src/module/common/exitTest.c @@ -27,8 +27,8 @@ testRun() { exitSafe(true); testLogResult( - "P00 ERROR: [125]: test error message\n" - "P00 INFO: archive-push command end: aborted with exception [125]"); + "P00 ERROR: [122]: test error message\n" + "P00 INFO: archive-push command end: aborted with exception [122]"); } TRY_END(); } diff --git a/test/test.pl b/test/test.pl index ef6681f01..b73da5049 100755 --- a/test/test.pl +++ b/test/test.pl @@ -42,6 +42,8 @@ use pgBackRestBuild::Build::Common; use pgBackRestBuild::Config::Build; use pgBackRestBuild::Config::BuildDefine; use pgBackRestBuild::Config::BuildParse; +use pgBackRestBuild::Error::Build; +use pgBackRestBuild::Error::Data; use BackRestDoc::Custom::DocCustomRelease; @@ -298,6 +300,8 @@ eval { # Auto-generate C files #--------------------------------------------------------------------------------------------------------------------------- + errorDefineLoad(${$oStorageBackRest->get("build/error.yaml")}); + my $rhBuild = { 'config' => @@ -317,6 +321,12 @@ eval &BLD_DATA => buildConfigParse(), &BLD_PATH => 'config', }, + + 'error' => + { + &BLD_DATA => buildError(), + &BLD_PATH => 'common', + }, }; buildAll("${strBackRestBase}/src", $rhBuild);