package Ada_Store.Trading.Department is pragma Elaborate_Body(Ada_Store.Trading.Department); type Instance is private; type Identifier is new Natural range 0 .. 50; function Lookup (Department_Number : in Identifier) return Instance; procedure Create_New (Department_Number : in Identifier; Description : in Short_Description; Min_Price : in Currency; Max_Price : in Currency; Tax_Rate : in Percentage := 0.00); procedure Remove (Department_Number : in Identifier); function Description (Department : in Instance) return Short_Description; function Min_Price (Department : in Instance) return Currency; function Max_Price (Department : in Instance) return Currency; function Tax_Rate (Department : in Instance) return Percentage; Invalid_Identifier : exception; private type Instance is record Department_Number : Identifier := 0; Description : Short_Description := (others => ' '); Min_Price : Currency := 0.0; Max_Price : Currency := 0.0; Tax_Rate : Percentage := 0.0; end record; end Ada_Store.Trading.Department;
with Ada.Direct_IO; with Ada.IO_Exceptions; with Ada_Store.Support.Trace; package body Ada_Store.Trading.Department is package Department_IO is new Ada.Direct_IO(Instance); Database_Name : String := "Dept.dat"; Database_File : Department_IO.File_Type; type Instance_Ptr is access all Instance; Database_Image : array (1 .. Identifier'Last) of Instance_Ptr; procedure Database_Init is Temp_Dept : Instance; begin Support.Trace.Put("Trading.Department.Database_Init Started"); begin Department_IO.Open(Database_File, Department_IO.Inout_File, Database_Name); for Dept in 1 .. Identifier'Last loop Department_IO.Read(Database_File, Temp_Dept, Department_IO.Positive_Count(Dept)); if Temp_Dept.Department_Number /= 0 then Database_Image(Dept) := new Instance; Database_Image(Dept).all := Temp_Dept; end if; end loop; exception when Ada.IO_Exceptions.Name_Error => Department_IO.Create(Database_File, Department_IO.Inout_File, Database_Name); for Dept in 1 .. Identifier'Last loop Department_IO.Write(Database_File, Temp_Dept, Department_IO.Positive_Count(Dept)); end loop; end; Support.Trace.Put("Trading.Department.Database_Init Done"); end Database_Init; function Lookup (Department_Number : in Identifier) return Instance is begin if Department_Number = 0 then raise Invalid_Identifier; end if; if Database_Image(Department_Number) = null or else Database_Image(Department_Number).Department_Number = 0 then raise Invalid_Identifier; end if; return Database_Image(Department_Number).all; end Lookup; procedure Create_New (Department_Number : in Identifier; Description : in Short_Description; Min_Price : in Currency; Max_Price : in Currency; Tax_Rate : in Percentage := 0.0) is begin if Department_Number = 0 then raise Invalid_Identifier; end if; Remove(Department_Number); if Database_Image(Department_Number) = null then Database_Image(Department_Number) := new Instance; end if; Database_Image(Department_Number).all := (Department_Number, Description, Min_Price, Max_Price, Tax_Rate); Department_IO.Write(Database_File, Instance(Database_Image(Department_Number).all), Department_IO.Positive_Count(Department_Number)); end Create_New; procedure Remove (Department_Number : in Identifier) is begin if Department_Number = 0 then raise Invalid_Identifier; end if; end Remove; function Description (Department : in Instance) return Short_Description is begin return Department.Description; end Description; function Min_Price (Department : in Instance) return Currency is begin return Department.Min_Price; end Min_Price; function Max_Price (Department : in Instance) return Currency is begin return Department.Max_Price; end Max_Price; function Tax_Rate (Department : in Instance) return Percentage is begin return Department.Tax_Rate; end Tax_Rate; begin Database_Init; end Ada_Store.Trading.Department;
Copyright ©
1996 Simon Johnston &
Addison Wesley Longman