PageRenderTime 38ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/mordor/pq/exception.cpp

http://github.com/mozy/mordor
C++ | 278 lines | 269 code | 8 blank | 1 comment | 276 complexity | 1954552de754b0ddc6a4b94ae4d44c0f MD5 | raw file
Possible License(s): BSD-3-Clause
  1. // Copyright (c) 2010 - Mozy, Inc.
  2. #include "exception.h"
  3. #include "mordor/log.h"
  4. namespace Mordor {
  5. namespace PQ {
  6. static Logger::ptr g_log = Log::lookup("mordor:pq");
  7. void throwException(PGconn *conn)
  8. {
  9. const char *error = PQerrorMessage(conn);
  10. MORDOR_LOG_ERROR(g_log) << conn << " connection error: " << error;
  11. MORDOR_THROW_EXCEPTION(ConnectionException(error));
  12. }
  13. void throwException(PGresult *result)
  14. {
  15. std::string message = PQresultErrorMessage(result);
  16. const char *sqlstate = PQresultErrorField(result, PG_DIAG_SQLSTATE);
  17. MORDOR_LOG_ERROR(g_log) << result << " " << sqlstate << ": " << message;
  18. if (!sqlstate || strlen(sqlstate) != 5)
  19. MORDOR_THROW_EXCEPTION(Exception(message));
  20. switch (sqlstate[0]) {
  21. case '2':
  22. switch (sqlstate[1]) {
  23. case '2':
  24. if (strncmp(sqlstate + 2, "000", 3) == 0)
  25. MORDOR_THROW_EXCEPTION(DataException(message));
  26. else if (strncmp(sqlstate + 2, "02E", 3) == 0)
  27. MORDOR_THROW_EXCEPTION(ArraySubscriptError(message));
  28. else if (strncmp(sqlstate + 2, "021", 3) == 0)
  29. MORDOR_THROW_EXCEPTION(CharacterNotInRepertoireException(message));
  30. else if (strncmp(sqlstate + 2, "008", 3) == 0)
  31. MORDOR_THROW_EXCEPTION(OverflowException(message));
  32. else if (strncmp(sqlstate + 2, "012", 3) == 0)
  33. MORDOR_THROW_EXCEPTION(DivisionByZeroException(message));
  34. else if (strncmp(sqlstate + 2, "005", 3) == 0)
  35. MORDOR_THROW_EXCEPTION(AssignmentError(message));
  36. else if (strncmp(sqlstate + 2, "00B", 3) == 0)
  37. MORDOR_THROW_EXCEPTION(EscapeCharacterConflictException(message));
  38. else if (strncmp(sqlstate + 2, "01E", 3) == 0 ||
  39. strncmp(sqlstate + 2, "01F", 3) == 0 ||
  40. strncmp(sqlstate + 2, "01G", 3) == 0)
  41. MORDOR_THROW_EXCEPTION(InvalidArgumentException(message));
  42. else if (strncmp(sqlstate + 2, "004", 3) == 0)
  43. MORDOR_THROW_EXCEPTION(NullValueNotAllowedException(message));
  44. else
  45. MORDOR_THROW_EXCEPTION(DataException(message));
  46. case '3':
  47. if (strncmp(sqlstate + 2, "000", 3) == 0)
  48. MORDOR_THROW_EXCEPTION(IntegrityConstraintViolationException(message));
  49. else if (strncmp(sqlstate + 2, "001", 3) == 0)
  50. MORDOR_THROW_EXCEPTION(RestrictViolationException(message));
  51. else if (strncmp(sqlstate + 2, "502", 3) == 0)
  52. MORDOR_THROW_EXCEPTION(NotNullViolationException(message));
  53. else if (strncmp(sqlstate + 2, "503", 3) == 0)
  54. MORDOR_THROW_EXCEPTION(ForeignKeyViolationException(message));
  55. else if (strncmp(sqlstate + 2, "505", 3) == 0)
  56. MORDOR_THROW_EXCEPTION(UniqueViolationException(message));
  57. else if (strncmp(sqlstate + 2, "514", 3) == 0)
  58. MORDOR_THROW_EXCEPTION(UniqueViolationException(message));
  59. else
  60. MORDOR_THROW_EXCEPTION(IntegrityConstraintViolationException(message));
  61. case '5':
  62. if (strncmp(sqlstate + 2, "000", 3) == 0)
  63. MORDOR_THROW_EXCEPTION(InvalidTransactionStateException(message));
  64. else if (strncmp(sqlstate + 2, "001", 3) == 0)
  65. MORDOR_THROW_EXCEPTION(ActiveTransactionException(message));
  66. else if (strncmp(sqlstate + 2, "002", 3) == 0)
  67. MORDOR_THROW_EXCEPTION(BranchTransactionAlreadyActiveException(message));
  68. else if (strncmp(sqlstate + 2, "008", 3) == 0)
  69. MORDOR_THROW_EXCEPTION(HeldCursorRequiresSameIsolationLevelException(message));
  70. else if (strncmp(sqlstate + 2, "003", 3) == 0)
  71. MORDOR_THROW_EXCEPTION(InappropriateAccessModeForBranchTransactionException(message));
  72. else if (strncmp(sqlstate + 2, "004", 3) == 0)
  73. MORDOR_THROW_EXCEPTION(InappropriateIsolationLevelForBranchTransactionException(message));
  74. else if (strncmp(sqlstate + 2, "005", 3) == 0)
  75. MORDOR_THROW_EXCEPTION(NoActiveTransactionForBranchException(message));
  76. else if (strncmp(sqlstate + 2, "006", 3) == 0)
  77. MORDOR_THROW_EXCEPTION(ReadOnlyTransactionException(message));
  78. else if (strncmp(sqlstate + 2, "007", 3) == 0)
  79. MORDOR_THROW_EXCEPTION(SchemaAndDataStatementMixingNotSupportedException(message));
  80. else if (strncmp(sqlstate + 2, "P01", 3) == 0)
  81. MORDOR_THROW_EXCEPTION(NoActiveTransactionException(message));
  82. else if (strncmp(sqlstate + 2, "P02", 3) == 0)
  83. MORDOR_THROW_EXCEPTION(InFailedTransactionException(message));
  84. else
  85. MORDOR_THROW_EXCEPTION(InvalidTransactionStateException(message));
  86. default:
  87. break;
  88. }
  89. case '4':
  90. switch (sqlstate[1]) {
  91. case '0':
  92. if (strncmp(sqlstate + 2, "000", 3) == 0)
  93. MORDOR_THROW_EXCEPTION(TransactionRollbackException(message));
  94. else if (strncmp(sqlstate + 2, "002", 3) == 0)
  95. MORDOR_THROW_EXCEPTION(TransactionIntegrityConstraintViolationException(message));
  96. else if (strncmp(sqlstate + 2, "001", 3) == 0)
  97. MORDOR_THROW_EXCEPTION(SerializationFailureException(message));
  98. else if (strncmp(sqlstate + 2, "003", 3) == 0)
  99. MORDOR_THROW_EXCEPTION(StatementCompletionUnknownException(message));
  100. else if (strncmp(sqlstate + 2, "P01", 3) == 0)
  101. MORDOR_THROW_EXCEPTION(DeadlockDetectedException(message));
  102. else
  103. MORDOR_THROW_EXCEPTION(TransactionRollbackException(message));
  104. case '2':
  105. if (strncmp(sqlstate + 2, "000", 3) == 0)
  106. MORDOR_THROW_EXCEPTION(AccessRuleViolationException(message));
  107. else if (strncmp(sqlstate + 2, "601", 3) == 0)
  108. MORDOR_THROW_EXCEPTION(SyntaxError(message));
  109. else if (strncmp(sqlstate + 2, "501", 3) == 0)
  110. MORDOR_THROW_EXCEPTION(InsufficientPrivilegeException(message));
  111. else if (strncmp(sqlstate + 2, "846", 3) == 0)
  112. MORDOR_THROW_EXCEPTION(CannotCoerceException(message));
  113. else if (strncmp(sqlstate + 2, "803", 3) == 0)
  114. MORDOR_THROW_EXCEPTION(GroupingError(message));
  115. else if (strncmp(sqlstate + 2, "P20", 3) == 0)
  116. MORDOR_THROW_EXCEPTION(WindowingError(message));
  117. else if (strncmp(sqlstate + 2, "P19", 3) == 0)
  118. MORDOR_THROW_EXCEPTION(InvalidRecursionException(message));
  119. else if (strncmp(sqlstate + 2, "830", 3) == 0)
  120. MORDOR_THROW_EXCEPTION(InvalidForeignKeyException(message));
  121. else if (strncmp(sqlstate + 2, "602", 3) == 0)
  122. MORDOR_THROW_EXCEPTION(InvalidNameException(message));
  123. else if (strncmp(sqlstate + 2, "622", 3) == 0)
  124. MORDOR_THROW_EXCEPTION(NameTooLongException(message));
  125. else if (strncmp(sqlstate + 2, "939", 3) == 0)
  126. MORDOR_THROW_EXCEPTION(ReservedNameException(message));
  127. else if (strncmp(sqlstate + 2, "804", 3) == 0)
  128. MORDOR_THROW_EXCEPTION(DatatypeMismatchException(message));
  129. else if (strncmp(sqlstate + 2, "P18", 3) == 0)
  130. MORDOR_THROW_EXCEPTION(IndeterminateDatatypeException(message));
  131. else if (strncmp(sqlstate + 2, "809", 3) == 0)
  132. MORDOR_THROW_EXCEPTION(WrongObjectTypeException(message));
  133. else if (strncmp(sqlstate + 2, "703", 3) == 0)
  134. MORDOR_THROW_EXCEPTION(UndefinedColumnException(message));
  135. else if (strncmp(sqlstate + 2, "883", 3) == 0)
  136. MORDOR_THROW_EXCEPTION(UndefinedFunctionException(message));
  137. else if (strncmp(sqlstate + 2, "P01", 3) == 0)
  138. MORDOR_THROW_EXCEPTION(UndefinedTableException(message));
  139. else if (strncmp(sqlstate + 2, "P02", 3) == 0)
  140. MORDOR_THROW_EXCEPTION(UndefinedParameterException(message));
  141. else if (strncmp(sqlstate + 2, "704", 3) == 0)
  142. MORDOR_THROW_EXCEPTION(UndefinedObjectException(message));
  143. else if (strncmp(sqlstate + 2, "701", 3) == 0)
  144. MORDOR_THROW_EXCEPTION(DuplicateColumnException(message));
  145. else if (strncmp(sqlstate + 2, "P03", 3) == 0)
  146. MORDOR_THROW_EXCEPTION(DuplicateCursorException(message));
  147. else if (strncmp(sqlstate + 2, "P04", 3) == 0)
  148. MORDOR_THROW_EXCEPTION(DuplicateDatabaseException(message));
  149. else if (strncmp(sqlstate + 2, "723", 3) == 0)
  150. MORDOR_THROW_EXCEPTION(DuplicateFunctionException(message));
  151. else if (strncmp(sqlstate + 2, "P05", 3) == 0)
  152. MORDOR_THROW_EXCEPTION(DuplicatePreparedStatementException(message));
  153. else if (strncmp(sqlstate + 2, "P06", 3) == 0)
  154. MORDOR_THROW_EXCEPTION(DuplicateSchemaException(message));
  155. else if (strncmp(sqlstate + 2, "P07", 3) == 0)
  156. MORDOR_THROW_EXCEPTION(DuplicateTableException(message));
  157. else if (strncmp(sqlstate + 2, "712", 3) == 0)
  158. MORDOR_THROW_EXCEPTION(DuplicateAliasException(message));
  159. else if (strncmp(sqlstate + 2, "710", 3) == 0)
  160. MORDOR_THROW_EXCEPTION(DuplicateObjectException(message));
  161. else if (strncmp(sqlstate + 2, "702", 3) == 0)
  162. MORDOR_THROW_EXCEPTION(AmbiguousColumnException(message));
  163. else if (strncmp(sqlstate + 2, "725", 3) == 0)
  164. MORDOR_THROW_EXCEPTION(AmbiguousFunctionException(message));
  165. else if (strncmp(sqlstate + 2, "P08", 3) == 0)
  166. MORDOR_THROW_EXCEPTION(AmbiguousParameterException(message));
  167. else if (strncmp(sqlstate + 2, "P09", 3) == 0)
  168. MORDOR_THROW_EXCEPTION(AmbiguousAliasException(message));
  169. else if (strncmp(sqlstate + 2, "P10", 3) == 0)
  170. MORDOR_THROW_EXCEPTION(InvalidColumnReferenceException(message));
  171. else if (strncmp(sqlstate + 2, "P11", 3) == 0)
  172. MORDOR_THROW_EXCEPTION(InvalidColumnDefinitionException(message));
  173. else if (strncmp(sqlstate + 2, "P12", 3) == 0)
  174. MORDOR_THROW_EXCEPTION(InvalidDatabaseDefinitionException(message));
  175. else if (strncmp(sqlstate + 2, "P13", 3) == 0)
  176. MORDOR_THROW_EXCEPTION(InvalidFunctionDefinitionException(message));
  177. else if (strncmp(sqlstate + 2, "P14", 3) == 0)
  178. MORDOR_THROW_EXCEPTION(InvalidPreparedStatementDefinitionException(message));
  179. else if (strncmp(sqlstate + 2, "P15", 3) == 0)
  180. MORDOR_THROW_EXCEPTION(InvalidSchemaDefinitionException(message));
  181. else if (strncmp(sqlstate + 2, "P16", 3) == 0)
  182. MORDOR_THROW_EXCEPTION(InvalidTableDefinitionException(message));
  183. else if (strncmp(sqlstate + 2, "P17", 3) == 0)
  184. MORDOR_THROW_EXCEPTION(InvalidObjectDefinitionException(message));
  185. else
  186. MORDOR_THROW_EXCEPTION(AccessRuleViolationException(message));
  187. default:
  188. break;
  189. }
  190. case '5':
  191. switch (sqlstate[1]) {
  192. case '3':
  193. if (strncmp(sqlstate + 2, "000", 3) == 0)
  194. MORDOR_THROW_EXCEPTION(InsufficientResourcesException(message));
  195. else if (strncmp(sqlstate + 2, "100", 3) == 0)
  196. MORDOR_THROW_EXCEPTION(DiskFullException(message));
  197. else if (strncmp(sqlstate + 2, "200", 3) == 0)
  198. MORDOR_THROW_EXCEPTION(OutOfMemoryException(message));
  199. else if (strncmp(sqlstate + 2, "300", 3) == 0)
  200. MORDOR_THROW_EXCEPTION(TooManyConnectionsException(message));
  201. else
  202. MORDOR_THROW_EXCEPTION(InsufficientResourcesException(message));
  203. case '4':
  204. if (strncmp(sqlstate + 2, "000", 3) == 0)
  205. MORDOR_THROW_EXCEPTION(ProgramLimitExceededException(message));
  206. else if (strncmp(sqlstate + 2, "001", 3) == 0)
  207. MORDOR_THROW_EXCEPTION(StatementTooComplexException(message));
  208. else if (strncmp(sqlstate + 2, "011", 3) == 0)
  209. MORDOR_THROW_EXCEPTION(TooManyColumnsException(message));
  210. else if (strncmp(sqlstate + 2, "023", 3) == 0)
  211. MORDOR_THROW_EXCEPTION(TooManyArgumentsException(message));
  212. else
  213. MORDOR_THROW_EXCEPTION(ProgramLimitExceededException(message));
  214. case '7':
  215. if (strncmp(sqlstate + 2, "000", 3) == 0)
  216. MORDOR_THROW_EXCEPTION(OperatorInterventionException(message));
  217. else if (strncmp(sqlstate + 2, "014", 3) == 0)
  218. MORDOR_THROW_EXCEPTION(QueryCanceledException(message));
  219. else if (strncmp(sqlstate + 2, "P01", 3) == 0)
  220. MORDOR_THROW_EXCEPTION(AdminShutdownException(message));
  221. else if (strncmp(sqlstate + 2, "P02", 3) == 0)
  222. MORDOR_THROW_EXCEPTION(CrashShutdownException(message));
  223. else if (strncmp(sqlstate + 2, "P03", 3) == 0)
  224. MORDOR_THROW_EXCEPTION(CannotConnectNowException(message));
  225. else
  226. MORDOR_THROW_EXCEPTION(OperatorInterventionException(message));
  227. case '8':
  228. if (strncmp(sqlstate + 2, "030", 3) == 0)
  229. MORDOR_THROW_EXCEPTION(IOError(message));
  230. else if (strncmp(sqlstate + 2, "P01", 3) == 0)
  231. MORDOR_THROW_EXCEPTION(UndefinedFileException(message));
  232. else if (strncmp(sqlstate + 2, "P02", 3) == 0)
  233. MORDOR_THROW_EXCEPTION(DuplicateFileException(message));
  234. else
  235. MORDOR_THROW_EXCEPTION(SystemError(message));
  236. default:
  237. break;
  238. }
  239. case 'F':
  240. switch (sqlstate[1]) {
  241. case '0':
  242. if (strncmp(sqlstate + 2, "000", 3) == 0)
  243. MORDOR_THROW_EXCEPTION(ConfigFileError(message));
  244. else if (strncmp(sqlstate + 2, "001", 3) == 0)
  245. MORDOR_THROW_EXCEPTION(LockFileExistsException(message));
  246. else
  247. MORDOR_THROW_EXCEPTION(ConfigFileError(message));
  248. default:
  249. break;
  250. }
  251. case 'X':
  252. switch (sqlstate[1]) {
  253. case 'X':
  254. if (strncmp(sqlstate + 2, "000", 3) == 0)
  255. MORDOR_THROW_EXCEPTION(InternalError(message));
  256. else if (strncmp(sqlstate + 2, "001", 3) == 0)
  257. MORDOR_THROW_EXCEPTION(DataCorruptedException(message));
  258. else if (strncmp(sqlstate + 2, "002", 3) == 0)
  259. MORDOR_THROW_EXCEPTION(IndexCorruptedException(message));
  260. else
  261. MORDOR_THROW_EXCEPTION(InternalError(message));
  262. default:
  263. break;
  264. }
  265. default:
  266. break;
  267. }
  268. MORDOR_THROW_EXCEPTION(Exception(message));
  269. }
  270. }}