Module: sql-odbc-implementation Author: eec Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND // $HopeName: !diagnostic.dylan(D-kan.5) $ //---------- Errors in error handling classes and methods define sealed abstract class () constant slot problem-diagnostic :: , required-init-keyword: problem-diagnostic:; constant slot diagnostic-return-code :: , required-init-keyword: diagnostic-return-code:; end class; define sealed class (, ) end class; define function return-code-name(return-code :: ) => (name :: ) select (return-code) $sql-success-with-info => "sql-success-with-info"; $sql-error => "sql-error"; $sql-invalid-handle => "sql-invalid-handle"; $sql-no-data => "sql-no-data"; otherwise => "unknown"; end select; end function; define method condition-to-string(diag-error :: ) => (string :: false-or()) format-to-string("ODBC Diagnostic Error - Return-code: (%=) %=\n", diag-error.diagnostic-return-code, return-code-name(diag-error.diagnostic-return-code)); end method; define sealed class (, ) end class; define method condition-to-string(diag-warning :: ) => (string :: false-or()) format-to-string("ODBC Diagnostic Warning - \n" " Return-code: (%=) %=\n", diag-warning.diagnostic-return-code, return-code-name(diag-warning.diagnostic-return-code)); end method; define sealed concrete class () constant slot unexpected-return-code :: , required-init-keyword: unexpected-return-code:; end class; define method condition-to-string(cond :: ) => (string :: false-or()) format-to-string("ODBC Unexpected Return Code - \n" " Return-code: (%=) %=\n", cond.unexpected-return-code, return-code-name(cond.unexpected-return-code)); end method; define sealed generic assert-diagnostic-goodness(diag :: , return-code :: ) => (); define method assert-diagnostic-goodness(diagnostic :: , return-code :: ) => () if (return-code ~= $sql-success) select (return-code) $sql-success-with-info => signal(make(, problem-diagnostic: diagnostic, diagnostic-return-code: return-code)); $sql-error, $sql-invalid-handle, $sql-no-data => error(make(, problem-diagnostic: diagnostic, diagnostic-return-code: return-code)); otherwise => error(make(, unexpected-return-code: return-code)); end select; end if; end method; //---------- Diagnostic ---------- define sealed concrete class () constant slot handle-type :: , init-keyword: handle-type:; constant slot handle :: , init-keyword: handle:; end class; define method command-function(diag :: ) => (command-function :: ); "" end method; define method dynamic-function(diag :: ) => (dynamic-function :: ) block () let (return-code, dynamic-function) = nice-SQLGetDiagField(diag.handle-type, diag.handle, 0, $sql-diag-dynamic-function); assert-diagnostic-goodness(diag, return-code); dynamic-function; exception (condition :: ) "" end block; end method; define method conditions-not-recorded?(diag :: ) => (not-recorded-status :: ) #f end method; define method row-count(diag :: ) => (row-count :: ); block () let (return-code, row-count) = nice-SQLGetDiagField(diag.handle-type, diag.handle, 0, $sql-diag-row-count); assert-diagnostic-goodness(diag, return-code); row-count; exception (condition :: ) 0; end block; end method; define method diagnostic-count(diag :: ) => (diagnostic-count :: ); let (return-code, diagnostic-count) = nice-SQLGetDiagField(diag.handle-type, diag.handle, 0, $sql-diag-number); assert-diagnostic-goodness(diag, return-code); diagnostic-count; end method; define method returned-sqlstate(diag :: ) => (returned-sqlstate :: ); let (return-code, returned-sqlstate) = nice-SQLGetDiagField(diag.handle-type, diag.handle, diag.condition-number, $sql-diag-sqlstate); assert-diagnostic-goodness(diag, return-code); returned-sqlstate end method; define method class-origin(diag :: ) => (class-origin :: ); let (return-code, class-origin) = nice-SQLGetDiagField(diag.handle-type, diag.handle, diag.condition-number, $sql-diag-class-origin); assert-diagnostic-goodness(diag, return-code); class-origin end method; define method subclass-origin(diag :: ) => (subclass-origin :: ); let (return-code, subclass-origin) = nice-SQLGetDiagField(diag.handle-type, diag.handle, diag.condition-number, $sql-diag-subclass-origin); assert-diagnostic-goodness(diag, return-code); subclass-origin end method; define method connection-name(diag :: ) => (connection-name :: ); let (return-code, connection-name) = nice-SQLGetDiagField(diag.handle-type, diag.handle, diag.condition-number, $sql-diag-connection-name); assert-diagnostic-goodness(diag, return-code); connection-name end method; define method message-text(diag :: ) => (message-text :: ); let (return-code, message-text) = nice-SQLGetDiagField(diag.handle-type, diag.handle, diag.condition-number, $sql-diag-message-text); assert-diagnostic-goodness(diag, return-code); message-text end method; define method next-dbms-diagnostic(diag :: ) => (next-condition :: false-or()) let diag-count = diagnostic-count(diag); if (diag.condition-number >= diag-count) #f else let (return-code, sqlstate) = nice-SQLGetDiagField(diag.handle-type, diag.handle, diag.condition-number + 1, $sql-diag-sqlstate); assert-diagnostic-goodness(diag, return-code); let condition-type = find-diagnostic($diagnostic-table, $odbc-diagnostics-key, sqlstate); if (unfound?(condition-type)) make(, sqlstate: sqlstate); else make(condition-type, condition-number: diag.condition-number + 1, handle-type: diag.handle-type, handle: diag.handle); end if; end if; end method; define method diagnostic-to-string (diag :: ) => (string :: ) format-to-string("Diagnostic - \n" " Conditions not recorded: %=\n" " Command function: %=\n" " Dynamic function: %=\n" " Row count: %=\n" " Condition/Diagnostic number: %=\n" " Returned SQLState: %=\n" " Class origin: %=\n" " Subclass origin: %=\n" " Connection name: %=\n" " Message Text: %=\n" " Native error code: %=\n", diag.conditions-not-recorded?, diag.command-function, diag.dynamic-function, diag.row-count, diag.condition-number, diag.returned-sqlstate, diag.class-origin, diag.subclass-origin, diag.connection-name, diag.message-text, diag.native-error-code); end method; //---------- Extensions to the diagnostic-detail protocol ---------- define method native-error-code(diag :: ) => (native-error-code :: ); let (return-code, native-error-code) = nice-SQLGetDiagField(diag.handle-type, diag.handle, diag.condition-number, $sql-diag-native); assert-diagnostic-goodness(diag, return-code); native-error-code end method; define method column-number(diag :: ) => (column-number :: ); let (return-code, column-number) = nice-SQLGetDiagField(diag.handle-type, diag.handle, diag.condition-number, $sql-diag-column-number); assert-diagnostic-goodness(diag, return-code); column-number; end method; define method row-number(diag :: ) => (row-number :: ); let (return-code, row-number) = nice-SQLGetDiagField(diag.handle-type, diag.handle, diag.condition-number, $sql-diag-row-number); assert-diagnostic-goodness(diag, return-code); row-number; end method; define method server-name(diag :: ) => (server-name :: ); let (return-code, server-name) = nice-SQLGetDiagField(diag.handle-type, diag.handle, diag.condition-number, $sql-diag-server-name); assert-diagnostic-goodness(diag, return-code); server-name; end method; //---------- Specific Diagnostic Detail Implementation ---------- define open class (, ) end class; define sealed class (, ) end class; define sealed class (, ) constant slot connection-exception-dbms :: , init-keyword: dbms:; constant slot connection-exception-database :: , init-keyword: database:; constant slot connection-exception-user :: , init-keyword: user:; end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; define sealed class (, ) end class; //---------- ODBC Unique Diagnostic Details define sealed class () keyword class-code: = "01"; keyword subclass-code: = "S00"; end class; define sealed class () keyword class-code: = "01"; keyword subclass-code: = "S01"; end class; define sealed class () keyword class-code: = "01"; keyword subclass-code: = "S02"; end class; define sealed class () keyword class-code: = "01"; keyword subclass-code: = "S06"; end class; define sealed class () keyword class-code: = "01"; keyword subclass-code: = "S07"; end class; define sealed class () keyword class-code: = "01"; keyword subclass-code: = "S08"; end class; define sealed class () keyword class-code: = "01"; keyword subclass-code: = "S09"; end class; define sealed class () keyword class-code: = "07"; keyword subclass-code: = "S01"; end class; define sealed class () keyword class-code: = "08"; keyword subclass-code: = "S01"; end class; define sealed class () keyword class-code: = "21"; keyword subclass-code: = "S01"; end class; define sealed class () keyword class-code: = "24"; keyword subclass-code: = "000"; end class; define sealed class () keyword class-code: = "25"; keyword subclass-code: = "S01"; end class; define sealed class () keyword class-code: = "25"; keyword subclass-code: = "S02"; end class; define sealed class () keyword class-code: = "25"; keyword subclass-code: = "S03"; end class; define sealed class () keyword class-code: = "42"; keyword subclass-code: = "S01"; end class; define sealed class () keyword class-code: = "42"; keyword subclass-code: = "S02"; end class; define sealed class () keyword class-code: = "42"; keyword subclass-code: = "S11"; end class; define sealed class () keyword class-code: = "42"; keyword subclass-code: = "S12"; end class; define sealed class () keyword class-code: = "42"; keyword subclass-code: = "S21"; end class; define sealed class () keyword class-code: = "42"; keyword subclass-code: = "S22"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "000"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "001"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "003"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "004"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "007"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "008"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "009"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "010"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "011"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "012"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "013"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "014"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "015"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "016"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "017"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "018"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "019"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "020"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "021"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "024"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "090"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "091"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "092"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "093"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "095"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "096"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "097"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "098"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "099"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "100"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "101"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "103"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "104"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "105"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "106"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "107"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "109"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "110"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "111"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "C00"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "T00"; end class; define sealed class () keyword class-code: = "HY"; keyword subclass-code: = "T01"; end class; define sealed class () keyword class-code: = "IM"; keyword subclass-code: = "001"; end class; define sealed class () keyword class-code: = "IM"; keyword subclass-code: = "002"; end class; define sealed class () keyword class-code: = "IM"; keyword subclass-code: = "003"; end class; define sealed class () keyword class-code: = "IM"; keyword subclass-code: = "004"; end class; define sealed class () keyword class-code: = "IM"; keyword subclass-code: = "005"; end class; define sealed class () keyword class-code: = "IM"; keyword subclass-code: = "006"; end class; define sealed class () keyword class-code: = "IM"; keyword subclass-code: = "007"; end class; define sealed class () keyword class-code: = "IM"; keyword subclass-code: = "008"; end class; define sealed class () keyword class-code: = "IM"; keyword subclass-code: = "009"; end class; define sealed class () keyword class-code: = "IM"; keyword subclass-code: = "010"; end class; define sealed class () keyword class-code: = "IM"; keyword subclass-code: = "011"; end class; define sealed class () keyword class-code: = "IM"; keyword subclass-code: = "012"; end class; define sealed class () keyword class-code: = "IM"; keyword subclass-code: = "014"; end class; define sealed class () keyword class-code: = "IM"; keyword subclass-code: = "015"; end class; define sealed class () keyword class-code: = "IM"; keyword subclass-code: = "013"; end class; //-------------------- Diagnostic Installation -------------------- define constant $odbc-diagnostics-key = #"odbc-dbms"; define function install-odbc-diagnostics(table :: ) => () local method install-diag(class :: ) => () install-diagnostic(table, class, key: $odbc-diagnostics-key) end method; install-diagnostic-key($odbc-diagnostics-key); //---------- Non-unique diagnostics ----------- install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag( ); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag( ); install-diag( ); install-diag(); install-diag( ); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); //---------- Unique ODBC Diagnostics ---------- install-diag(); install-diag(); install-diag(); install-diag(); install-diag( ); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag( ); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); install-diag(); end function; register-diagnostic-installer(install-odbc-diagnostics);