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;
Copyright ©
1996 Simon Johnston &
Addison Wesley Longman