MODULE DB;
Darko Volaric September 2002 An adaption of the previous version to
allow concurrent connections to different database interfaces. This
module is used as to glue the database specific modules together and
provide backward compatiblity. Please email darko@peter.com.au with any
problems.
IMPORT PostgreSQLDB, ODBCDB, MySQLDB, Text;
VAR
Default : Interface := NIL;
Interfaces: InterfaceList := NIL;
REVEAL
Interface = InterfacePublic BRANDED OBJECT
OVERRIDES
set_default := SetDefaultInterface;
END;
PROCEDURE Init () =
BEGIN
Interfaces := NEW(InterfaceList, 3);
Interfaces^[0] := PostgreSQLDB.GetInterface();
Interfaces^[1] := ODBCDB.GetInterface();
Interfaces^[2] := MySQLDB.GetInterface();
FOR i := 0 TO LAST(Interfaces^) DO
IF Interfaces[i] # NIL THEN Default := Interfaces[i]; EXIT; END;
END;
IF Default = NIL THEN
(* FIXME: Riase a error, but should an execption be raised at module
init time? *)
END;
END Init;
PROCEDURE GetInterfaces (): InterfaceList =
BEGIN
RETURN Interfaces;
END GetInterfaces;
PROCEDURE SetDefaultInterface (this: Interface) =
BEGIN
Default := this;
END SetDefaultInterface;
PROCEDURE FindInterface (name: TEXT): Interface RAISES {Error} =
BEGIN
IF name = NIL THEN name := "" END;
(* there's not going to be alot of interfaces... linear search is
good! *)
FOR i := 0 TO LAST(Interfaces^) DO
IF Interfaces[i] # NIL AND Text.Equal(name, Interfaces[i].name) THEN
RETURN Interfaces[i];
END;
END;
RAISE Error(NEW(ErrorDesc, state := ARRAY [0 .. 5] OF CHAR{' ', ..},
description := "Interface '" & name & "' not found.",
native_err := 0));
END FindInterface;
PROCEDURE GetDefaultInterface (): Interface =
BEGIN
RETURN Default;
END GetDefaultInterface;
PROCEDURE Connect (database, user_id, password: TEXT;
server : TEXT := NIL;
interface : Interface := NIL ): T
RAISES {Error} =
BEGIN
IF interface = NIL THEN
RETURN Default.connect(database, user_id, password, server);
ELSE
RETURN interface.connect(database, user_id, password, server);
END;
END Connect;
PROCEDURE GetDataSources (): DescList RAISES {Error} =
BEGIN
RETURN Default.get_data_sources();
END GetDataSources;
PROCEDURE GetDrivers (): DescList RAISES {Error} =
BEGIN
RETURN Default.get_drivers();
END GetDrivers;
BEGIN
Init();
END DB.