aboutsummaryrefslogtreecommitdiffstats
path: root/lib/odbc/doc/src/error_handling.xml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/odbc/doc/src/error_handling.xml')
-rw-r--r--lib/odbc/doc/src/error_handling.xml174
1 files changed, 174 insertions, 0 deletions
diff --git a/lib/odbc/doc/src/error_handling.xml b/lib/odbc/doc/src/error_handling.xml
new file mode 100644
index 0000000000..26ad7f9848
--- /dev/null
+++ b/lib/odbc/doc/src/error_handling.xml
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="latin1" ?>
+<!DOCTYPE chapter SYSTEM "chapter.dtd">
+
+<chapter>
+ <header>
+ <copyright>
+ <year>2003</year><year>2009</year>
+ <holder>Ericsson AB. All Rights Reserved.</holder>
+ </copyright>
+ <legalnotice>
+ The contents of this file are subject to the Erlang Public License,
+ Version 1.1, (the "License"); you may not use this file except in
+ compliance with the License. You should have received a copy of the
+ Erlang Public License along with this software. If not, it can be
+ retrieved online at http://www.erlang.org/.
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and limitations
+ under the License.
+
+ </legalnotice>
+
+ <title>Error handling</title>
+ <prepared>Ingela Anderton</prepared>
+ <responsible></responsible>
+ <docno></docno>
+ <approved></approved>
+ <checked></checked>
+ <date></date>
+ <rev></rev>
+ <file>error_handling.xml</file>
+ </header>
+
+ <section>
+ <title>Strategy </title>
+ <p>On a conceptual level starting a database connection using the
+ Erlang ODBC API is a basic client server application. The client
+ process uses the API to start and communicate with the server
+ process that manages the connection. The strategy of the Erlang
+ ODBC application is that programming faults in the application
+ itself will cause the connection process to terminate
+ abnormally.(When a process terminates abnormally its supervisor
+ will log relevant error reports.) Calls to API functions during or
+ after termination of the connection process, will return <c>{error, connection_closed}</c>. Contextual errors on the other
+ hand will not terminate the connection it will only return
+ <c>{error, Reason} </c> to the client, where <c>Reason</c> may be
+ any erlang term.</p>
+
+ <section>
+ <title>Clients </title>
+ <p>The connection is associated with the process that created it
+ and can only be accessed through it. The reason for this is to
+ preserve the semantics of result sets and transactions when
+ select_count/[2,3] is called or auto_commit is turned off.
+ Attempts to use the connection from another process will
+ fail. This will not effect the connection. On the other hand, if
+ the client process dies the connection will be terminated.</p>
+ </section>
+
+ <section>
+ <title>Timeouts </title>
+ <p>All request made by the client to the connection are
+ synchronous. If the timeout is used and expires the client
+ process will exit with reason timeout. Proably the right thing
+ to do is let the client die and perhaps be restarted by its
+ supervisor. But if the client chooses to catch this timeout,
+ it is a good idea to wait a little while before trying
+ again. If there are too many consecutive timeouts that are
+ caught the connection process will conclude that there is
+ something radically wrong and terminate the connection.</p>
+ </section>
+
+ <section>
+ <title>Gaurds </title>
+ <p>All API-functions are guarded and if you pass an argument of
+ the wrong type a runtime error will occur. All input parameters
+ to internal functions are trusted to be correct. It is a good
+ programming practise to only distrust input from truly external
+ sources. You are not supposed to catch these errors, it will
+ only make the code very messy and much more complex, which
+ introduces more bugs and in the worst case also covers up the
+ actual faults. Put your effort on testing instead, you should
+ trust your own input.</p>
+ </section>
+ </section>
+
+ <section>
+ <title>The whole picture </title>
+ <p>As the Erlang ODBC application relies on third party products
+ and communicates with a database that probably runs on an other
+ computer in the network there are plenty of things that might go
+ wrong. To fully understand the things that might happen it
+ facilitate to know the design of the Erlang ODBC application,
+ hence here follows a short description of the current design.</p>
+ <note>
+ <p>Please note that design is something, that not
+ necessarily will, but might change in future releases. While the
+ semantics of the API will not change as it is independent of the
+ implementation.</p>
+ </note>
+ <image file="odbc_app_arc.gif">
+ <icaption>Architecture of the Erlang odbc application</icaption>
+ </image>
+ <p>When you do application:start(odbc) the only thing that
+ happens is that a supervisor process is started. For each call
+ to the API function connect/2 a process is spawned and added as
+ a child to the Erlang ODBC supervisor. The supervisors only
+ tasks are to provide error-log reports, if a child process should
+ die abnormally, and the possibility to do a code change. Only
+ the client process has the knowledge to decide if this
+ connection managing process should be restarted.</p>
+ <p>The erlang connection process spawned by connect/2, will open a
+ port to a c-process that handles the communication with the
+ database through Microsoft's ODBC API. The erlang port will be
+ kept open for exit signal propagation, if something goes wrong
+ in the c-process and it exits we want know as mush as possible
+ about the reason. The main communication with the c-process is
+ done through sockets. The C-process consists of two threads,
+ the supervisor thread and the database handler thread. The
+ supervisor thread checks for shutdown messages on the supervisor
+ socket and the database handler thread receives requests and sends
+ answers on the database socket. If the database thread seems to
+ hang on some database call, the erlang control process will send
+ a shutdown message on the supervisor socket, in this case the
+ c-process will exit. If the c-process crashes/exits it will
+ bring the erlang-process down too and vice versa i.e. the
+ connection is terminated.</p>
+ <note>
+ <p>The function connect/2 will start the odbc application if
+ that is not already done. In this case a supervisor information
+ log will be produced stating that the odbc application was started
+ as a temporary application. It is really the responsibility of the
+ application that uses the API too make sure it is started in the
+ desired way.</p>
+ </note>
+
+ <section>
+ <title>Error types</title>
+ <p>The types of errors that may occur can be divide into the
+ following categories.</p>
+ <list type="bulleted">
+ <item>Configuration problems - Everything from that the
+ database was not set up right to that the c-program that
+ should be run through the erlang port was not compiled for
+ your platform.</item>
+ <item>Errors discovered by the ODBC driver - If calls to the
+ ODBC-driver fails due to circumstances that can not be
+ controlled by the Erlang ODBC application programmer, an
+ error string will be dug up from the driver. This string
+ will be the <c>Reason</c> in the <c>{error, Reason} </c>
+ return value. How good this error message is will of course
+ be driver dependent. Examples of such circumstances are
+ trying to insert the same key twice, invalid SQL-queries and
+ that the database has gone off line.</item>
+ <item>Connection termination - If a connection is terminated
+ in an abnormal way, or if you try to use a connection that
+ you have already terminated in a normal way by calling
+ disconnect/1, the return value will be<c>{error, connection_closed}</c>. A connection could end abnormally
+ because of an programming error in the Erlang ODBC
+ application, but also if the ODBC driver crashes.</item>
+ <item>Contextual errors - If API functions are used in the
+ wrong context, the <c>Reason</c> in the error tuple will
+ be a descriptive atom. For instance if you try to call the
+ function <c>last/[1,2] </c> without first calling <c>select_count/[2,3] </c> to associate a result set with the
+ connection. If the ODBC-driver does not support some
+ functions, or if you disabled some functionality for a
+ connection and then try to use it.</item>
+ </list>
+ </section>
+ </section>
+</chapter>
+
+