package Ada_Store.Trading.Department

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;

Contents Page

Copyright © 1996 Simon Johnston &
Addison Wesley Longman