package Ada_Store.Trading.Tender

package Ada_Store.Trading.Tender is

   type Instance 	is private;
   
   type Identifier	is new Natural range 0 .. 20;
   
   function  Lookup
     (Tender_ID	: in Identifier)
      return Instance;

   procedure Create_New
     (Tender_ID	  : in Identifier;
      Description : in Short_Description;
      Min_Amount  : in Currency;
      Max_Amount  : in Currency);

   procedure Remove
     (Tender_ID	: in Identifier);

   function  Authorise
     (Tender : in Instance;
      Amount : in Currency)
      return Boolean;

   function  Description
     (Tender : in Instance)
      return Short_Description;

   Invalid_Identifier : exception;

private
   type Instance 	is
      record
	 Tender_ID	: Identifier := 0;
	 Description	: Short_Description := (others => ' ');
         Min_Amount     : Currency   := 0.00;
         Max_Amount     : Currency   := 0.00;
      end record;
   
end Ada_Store.Trading.Tender;

with Ada.Direct_IO;
with Ada.IO_Exceptions;

with Ada_Store.Support.Trace;

package body Ada_Store.Trading.Tender is

   package Tender_IO is new Ada.Direct_IO(Instance);

   Database_Name  : String := "Tender.dat";
   Database_File  : Tender_IO.File_Type;

   type Instance_Ptr is access all Instance;
   Database_Image : array (1 .. Identifier'Last) of Instance_Ptr;

   procedure Database_Init is
      Temp_Tender : Instance;
   begin
      Support.Trace.Put("Trading.Tender.Database_Init Started");
      begin
	 Tender_IO.Open(Database_File,
			Tender_IO.Inout_File,
			Database_Name);
	 for Tender in 1 .. Identifier'Last loop
	    Tender_IO.Read(Database_File,
			   Temp_Tender,
			   Tender_IO.Positive_Count(Tender));

	    if Temp_Tender.Tender_ID /= 0 then
	       Database_Image(Tender) := new Instance;
	       Database_Image(Tender).all := Temp_Tender;
	    end if;
	 end loop;
      exception
	 when Ada.IO_Exceptions.Name_Error =>
	    Tender_IO.Create(Database_File,
			     Tender_IO.Inout_File,
			     Database_Name);

	    for Tender in 1 .. Identifier'Last loop
	       Tender_IO.Write(Database_File,
			       Temp_Tender,
			       Tender_IO.Positive_Count(Tender));
	    end loop;
      end;
      Support.Trace.Put("Trading.Tender.Database_Init Done");
   end Database_Init;

   function  Lookup
     (Tender_ID	: in Identifier)
      return Instance is
   begin
      if Database_Image(Tender_ID) = null then
	 raise Invalid_Identifier;
      end if;

      return Database_Image(Tender_ID).all;
   end Lookup;

   procedure Create_New
     (Tender_ID	  : in Identifier;
      Description : in Short_Description;
      Min_Amount  : in Currency;
      Max_Amount  : in Currency) is
   begin
      Remove(Tender_ID);

      if Database_Image(Tender_ID) = null then

	 Database_Image(Tender_ID) := new Instance;
      end if;
      Database_Image(Tender_ID).all := (Tender_ID, 
					Description,
					Min_Amount,
					Max_Amount);
      
      Tender_IO.Write(Database_File,
		      Instance(Database_Image(Tender_ID).all),
		      Tender_IO.Positive_Count(Tender_ID));
   end Create_New;

   procedure Remove
     (Tender_ID	: in Identifier) is
   begin
      null;
   end Remove;

   function  Authorise
     (Tender : in Instance;
      Amount : in Currency)
      return Boolean is
   begin
      if Amount > Tender.Min_Amount and 
	 Amount < Tender.Max_Amount then

	 return True;
      else
	 return False;
      end if;
   end Authorise;

   function  Description
     (Tender : in Instance)
      return Short_Description is
   begin
      return Tender.Description;
   end Description;

begin
   Database_Init;
end Ada_Store.Trading.Tender;

Contents Page

Copyright © 1996 Simon Johnston &
Addison Wesley Longman