comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: APQ
Date: Fri, 17 Dec 2004 14:54:56 +0100
Date: 2004-12-17T14:54:56+01:00	[thread overview]
Message-ID: <43jrvek9m28o.r8ywhg3uqgud.dlg@40tude.net> (raw)
In-Reply-To: sa4brcv2l5m.fsf@snoopy.apana.org.au

On Thu, 16 Dec 2004 10:31:49 +1100, Brian May wrote:

> 1. Decide on or write a "smart pointer" library. ie. a library that
> manages pointers based on a reference count. Obviously the license
> must be compatible with the license of APQ.

I have one in http://www.dmitry-kazakov.de/ada/components.htm
 
> 3. Create new Database_Type. This type should not be
> tagged. Applications will use this instead of the
> Root_Connection_Type. It has the following data:
> 
> * Smart pointer to Root_Connection_Type'Class. This is dynamically
>   allocated when the connection is created.

It should *be* a smart pointer. Generally with components it goes as
follows:

package APQ.Handles is
   type Database_Type is private;
   -- Here all visible methods
   function Connect (...) return Data_Base_Type;
   ...
private
   -- Wrapper type for Root_Connection_Type'Class, to implement
   -- mix-in. Necessary, only because Root_Connection_Type is not
   -- a descendant of Object.Entity. Ptr points to the connection
   -- object allocated by Connect. Data_Base_Object itself is also
   -- allocated by Connect. It is destroyed as soon as the
   -- last handle to it disappears.
   --
   type Root_Connection_Ptr is access Root_Connection_Type'Class;
   type Data_Base_Object is new Object.Entity with record
      Ptr : Root_Connection_Ptr;
   end record;
   type Data_Base_Ptr is access Data_Base_Object'Class;
   --
   -- Finalize deletes Ptr.
   --
   procedure Finalize (Object : Data_Base_Object);
   --
   -- Handles, for internal use, they do not have any
   -- interesting methods.
   --
   package Connection_Handles is
      new Object.Handle (Data_Base_Object, Data_Base_Ptr);
   --
   -- Database_Type is a handle
   --
   type Database_Type is new Connection_Handles.Handle;
end APQ.Handles;

> It has the following methods:
> 
>   * Connect method takes a string, which is the connection URL.  Note:
>     Two ways of implementing:
> 
>     1. connect is hard-coded to support every possible database, and
>        parses the URL itself.
> 
>     2. each database is registered in a global list, connect
>        determines the most appropriate database based on prefix in URL
>        and calls appropriate connect method with URL.
> 
>     The second method is more complicated but more flexible. In any
>     case, changing this should not require changing the user API.
> 
>   * All methods associated with Root_Connection_Type. This does *not*
>     include options to set options specific to the database, like user
>     name or password. These call the appropriate routine in the
>     Root_Connection_Type'Class. Status information should perhaps be
>     cached, so it remains constant even after queries (might be more
>     appropriate way to handle errors).
> 
>   * New_Query takes a *Database_Type* parameter, not a
>     Root_Connection_Type parameter. This function constraints a query
>     and saves a smart pointer to the Root_Connection_Type contained
>     within the Database_Type variable.

You could leave it as is and add a handle to a query, which will be created
from a handle to data base. It is a standard pattern: user interface has
only handles:

Handle to connection  ---> Connection_Object --> Connection_Type

Handle to query  ---> Query_Object --------> Query_Type
                      Handle to connection

Query_Object has a handle to its connection as a component. This ensures
that the Connection_Object will never be finalized before it. The original
Conncetion_Type and Query_Type may be left intact. They will be allocated
by handle constructors and destroyed automatically.

>   * Debatable: Function that returns smart pointer to
>     Root_Connection_Type'Class.  This might be required to access
>     database specific functions. Ideally it shouldn't be required.
> 
> 4. Modify Root_Query_Type class:
> 
>    New_Query is the only function that takes a *Database_Type*
>    parameter.
> 
>    The functions that use to require Root_Connection_Type now use the
>    smart pointer that was saved instead.
> 
>    Why not make the procedures abstract instead of having them raise
>    an Is_Abstract? This way the checks can be done at compile time.
> 
>    Execute already returns exception if not connected.
>
>    Add methods for obtaining and clearing status information. This
>    should be cached so if you execute two separate queries (in two
>    separate variables) on the same database, you will get two status
>    messages saved.
>  
> I hope this helps explain what I said earlier... I believe this solves
> a number of concerns with the existing system in one go.
> 
> The major difference is that I have created a new Database_Type class,
> which allows the Connection_Type to be shared in a safe manner between
> the user Database_Type and the user Query_Type classes.
> 
> This would involve making incompatible changes to Root_Query_Type. It
> might be possible to avoid this, not sure if it would be worth the
> effort.

No, if you would make a handle for Root_Query_Type.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de



  parent reply	other threads:[~2004-12-17 13:54 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-12-15 23:31 APQ Brian May
2004-12-16 11:34 ` APQ Warren W. Gay VE3WWG
2004-12-16 23:58   ` APQ Randy Brukardt
2004-12-17  3:45     ` APQ Brian May
2004-12-17  4:03       ` APQ Warren W. Gay VE3WWG
2004-12-17  4:38         ` APQ Brian May
2004-12-17  9:06           ` APQ Egil H. H�vik
2004-12-17 11:42             ` APQ Brian May
2004-12-17 22:55               ` APQ Brian May
2004-12-18 15:52                 ` APQ Warren W. Gay VE3WWG
2004-12-18 18:23                   ` APQ Dmitry A. Kazakov
2004-12-21 23:34                     ` APQ Brian May
2004-12-22  8:57                       ` APQ Dmitry A. Kazakov
2004-12-22 10:07                   ` APQ Martin Krischik
2004-12-22 13:15                     ` APQ Dmitry A. Kazakov
2004-12-22 16:53                       ` APQ Martin Krischik
2004-12-22 17:21                         ` APQ Dmitry A. Kazakov
2004-12-22 18:23                           ` APQ Martin Krischik
2004-12-17  8:59       ` APQ Stephen Leake
2004-12-17 14:12       ` APQ Dmitry A. Kazakov
2004-12-17 23:20         ` APQ Brian May
2004-12-18 16:13           ` APQ Dmitry A. Kazakov
2004-12-21 23:29         ` APQ Brian May
2004-12-22  9:14           ` APQ Dmitry A. Kazakov
2005-01-04 21:32             ` APQ Brian May
2005-01-05 11:58               ` APQ Dmitry A. Kazakov
2004-12-23 17:04           ` APQ (Connection Cloning) Warren W. Gay VE3WWG
2004-12-23 17:55             ` Georg Bauhaus
2004-12-23 18:52               ` Warren W. Gay VE3WWG
2005-01-03  7:40                 ` Frank Piron
2004-12-17 13:54 ` Dmitry A. Kazakov [this message]
  -- strict thread matches above, loose matches on Subject: below --
2004-12-16  4:37 APQ Christoph Karl Walter Grein
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox