|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: B T
Length: 24881 (0x6131)
Types: TextFile
Names: »B«
└─⟦149519bd4⟧ Bits:30000546 8mm tape, Rational 1000, !projects 93-07-13
└─⟦124ff5788⟧ »DATA«
└─⟦this⟧
└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11
└─⟦129cab021⟧ »DATA«
└─⟦this⟧
└─⟦f64eaa120⟧ Bits:30000752 8mm tape, Rational 1000, !projects 93 02 16
└─⟦6f12a12be⟧ »DATA«
└─⟦this⟧
└─⟦2f6cfab89⟧ Bits:30000547 8mm tape, Rational 1000, !projects 94-01-04
└─⟦d65440be7⟧ »DATA«
└─⟦this⟧
with Asaopen;
with Device_Independent_Io;
with Job_Segment;
with Gateway_Object;
separate (Actions)
package body Model is
package Asac renames Asa_Definitions.Commands;
package Diio renames Device_Independent_Io;
Annotations : constant String :=
Asa_Definitions.Main_Class_Directory & ".ANNOTATIONS";
Annotation_Types : constant String :=
Asa_Definitions.Main_Class_Directory & ".ANNOTATION_TYPES";
Associated : constant String :=
Asa_Definitions.Main_Class_Directory & ".ASSOCIATED";
procedure Image_Name (Handle : Dc.Gateway_Handle;
Visible : Boolean;
Read_Only : Boolean;
No_Image : out Boolean;
Show_Property_Image : out Boolean;
Id : out Dc.Image_Identity) is
Gateway_Object : constant Dir.Object := Gwo.Directory_Object (Handle);
S : Ss.Condition;
begin
Show_Property_Image := False;
Id := (I1 => Dir.Unique (Gateway_Object), I2 => 0);
No_Image := True;
if not Read_Only then
S := Check_Writeable (Handle);
Logger.Status (S);
end if;
exception
when Profile.Error =>
Logger.Error ("Image construction is quitting after errors",
Raise_Error => False);
end Image_Name;
procedure Build_Image (Handle : Dc.Gateway_Handle;
Visible : Boolean;
In_Place : Boolean;
First_Time : Boolean;
Read_Only : in out Boolean;
Image : Dc.Image_Id;
No_Image : out Boolean;
Underlying_Object : out Directory.Object) is
Action_Id : Action.Id;
C : Ro.Context;
Directory_Exists : Boolean;
File_Exists : Boolean;
Has_Destroyed_Gateway : Boolean;
S : Ss.Condition;
Gateway_Object : constant Dir.Object := Gwo.Directory_Object (Handle);
Gateway_Full_Name : constant String :=
Dir.Naming.Get_Full_Name (Gateway_Object);
Host : constant String := Asap.Data_Host (Handle);
Model : constant String := Asap.Data_Context (Handle) &
Unix.Context_Separator &
Asap.Data_Name (Handle);
use Gateways;
begin
No_Image := True;
Underlying_Object := Gateway_Object;
if not Read_Only then
if Ss.Error (Check_Writeable (Handle)) then
return;
end if;
end if;
Ro.Acquire (A_Context => C,
Status => S,
Machine => Host,
Instance => Asa_Definitions.Asa);
Logger.Status (S, Interactive => True);
if not Is_Up_To_Date (Handle, In_Context => C) then
case Asas.Action_When_Out_Of_Date is
when Asas.Abandon =>
Logger.Negative
("The gateway object " & Gateway_Full_Name &
" may not be up-to-date. Use Asa.Accept_Changes " &
"to update it");
when Asas.Accept_Changes =>
Logger.Positive
("The gateway object " & Gateway_Full_Name &
" may not be up-to-date. Changes are being accepted");
Gwo.Close (Handle, S);
Logger.Status (S, Interactive => True);
Action_Id := Action.Start;
Accept_Changes
(Gateway_Object => Gateway_Object,
In_Context => C,
Model => Model,
Comments => "Automatic Accept_Changes issued by " &
"Build_Image from object " &
Gateway_Full_Name,
Work_Order => "<DEFAULT>",
Action_Id => Action_Id,
Has_Destroyed_Gateway => Has_Destroyed_Gateway);
Action.Finish (The_Action => Action_Id, Do_Commit => True);
if Has_Destroyed_Gateway then
Logger.Error
("Gateway object " & Gateway_Full_Name &
" has been destroyed while accepting changes. " &
"Unable to create an image for it.");
else
Gwo.Open_Object (Object => Gateway_Full_Name,
Slot => Gwo.Main_Slot,
H => Handle,
Errors => S);
Logger.Status (S, Interactive => True);
end if;
when Asas.Continue =>
Logger.Warning ("The gateway object " & Gateway_Full_Name &
" may not be up-to-date.");
end case;
end if;
--
-- Before calling asaedit we check the existence of the file,
-- because asaedit won't tell much it they do not exist.
--
Ro.File_Exists (The_File => Asap.Data_Context (Handle),
In_Context => C,
Status => S,
Exists => Directory_Exists);
Logger.Status (S);
if Directory_Exists then
if Read_Only then
Ro.File_Exists
(The_File =>
Asap.Data_Context (Handle) & Unix.Context_Separator &
Asap.Data_Name (Handle),
In_Context => C,
Status => S,
Exists => File_Exists);
Logger.Status (S);
if not File_Exists then
Logger.Negative ("Remote file " &
Asap.Data_Context (Handle) &
Unix.Context_Separator &
Asap.Data_Name (Handle) &
" does not exist");
end if;
end if;
else
Logger.Negative ("Remote directory " &
Asap.Data_Context (Handle) & " does not exist");
end if;
declare
Remote_Annotations : constant String :=
Unix.Temporary_Filename (Asac.Annotations_Extension);
Remote_Annotation_Types : constant String :=
Unix.Temporary_Filename (Asac.Annotation_Types_Extension);
Asaedit_Command : constant String :=
Asas.Bin_Directory (Asap.Data_Host (Handle)) &
Unix.Context_Separator &
Asac.Asaedit &
' ' &
Asap.Data_Context (Handle) &
Unix.Context_Separator &
Asap.Data_Name (Handle) &
' ' &
Asac.Start_Node &
' ' &
Asap.Asa_Node_Number (Handle) &
' ' &
Asac.No_Warnings &
' ' &
Asac.Annotations &
' ' &
Remote_Annotations &
' ' &
Asac.Annotation_Types &
' ' &
Remote_Annotation_Types;
Rm_Command : constant String := Unix.Remove &
' ' &
Remote_Annotations &
' ' &
Remote_Annotation_Types;
begin
Logger.Note ("Copying file " & Annotations &
" to " & Remote_Annotations);
Ro.Put (From_File => Annotations,
To_File => Remote_Annotations,
In_Context => C,
Status => S);
Logger.Status (S, Interactive => True);
Logger.Note ("Copying file " & Annotation_Types &
" to " & Remote_Annotation_Types);
Ro.Put (From_File => Annotation_Types,
To_File => Remote_Annotation_Types,
In_Context => C,
Status => S);
Logger.Status (S, Interactive => True);
if Read_Only then
Execute (Command => Asaedit_Command &
' ' &
Asac.Read_Only &
Unix.Command_Separator &
Rm_Command,
Interactive => True,
In_Context => C,
Timeout => Ro.Wait_Forever);
else
Execute (Command => Asaedit_Command &
Unix.Command_Separator &
Rm_Command,
Interactive => True,
In_Context => C,
Timeout => Ro.Wait_Forever);
end if;
end;
Ro.Release (A_Context => C, Status => S);
Logger.Status (S, Interactive => True);
exception
when Profile.Error =>
Logger.Error ("Image construction is quitting after errors",
Raise_Error => False);
end Build_Image;
--[bug]
-- Due to a bug in DISPATCH, the CMVC operations are called with an
-- handle that it not open under the action used for the operation.
-- To avoid locking problems, we immediately close the handle and
-- reopen the same object with the appropriate action. However there
-- is still an interesting issue: when the handle is reopen for the
-- post operation (with a new action), a locking error may be
-- detected, and the post operation may be called with a closed
-- handle. We have to live with this...
--
function Reopen (Handle : in Gwo.Handle; Action_Id : in Action.Id)
return Gwo.Handle is
Result : Gwo.Handle;
S : Ss.Condition;
The_Object : constant Dir.Object := Gwo.Directory_Object (Handle);
begin
Gwo.Close (Handle);
Gwo.Open_Main_Object (Object => The_Object,
H => Result,
Update => False,
Action_Id => Action_Id,
Errors => S);
Logger.Status (S);
return Result;
end Reopen;
procedure Pre_Check_In (Handle : Dc.Gateway_Handle;
Subobject : Directory.Object;
Response : Profile.Response_Profile;
Action_Id : Action.Id;
Errors : in out Dc.Error_Counts) is
The_Handle : Dc.Gateway_Handle := Reopen (Handle, Action_Id);
C : Ro.Context;
Has_Destroyed_Gateway : Boolean;
S : Ss.Condition;
The_Action : Action.Id := Action_Id;
Gateway_Object : constant Dir.Object :=
Gwo.Directory_Object (The_Handle);
Gateway_Full_Name : constant String :=
Dir.Naming.Get_Full_Name (Gateway_Object);
Host : constant String := Asap.Data_Host (The_Handle);
Model : constant String := Asap.Data_Context (The_Handle) &
Unix.Context_Separator &
Asap.Data_Name (The_Handle);
begin
Profile.Set (Response);
Ro.Acquire (A_Context => C,
Status => S,
Machine => Host,
Instance => Asa_Definitions.Asa);
Logger.Status (S, Interactive => True);
if not Is_Up_To_Date (The_Handle, In_Context => C) then
Logger.Positive ("Accepting changes from model " & Model);
Gwo.Close (The_Handle, S);
Logger.Status (S, Interactive => True);
Accept_Changes
(Gateway_Object => Gateway_Object,
In_Context => C,
Model => Model,
Comments => "Automatic Accept_Changes issued by " &
"Check_In from object " & Gateway_Full_Name,
Work_Order => "<DEFAULT>",
Action_Id => Action_Id,
Has_Destroyed_Gateway => Has_Destroyed_Gateway);
if Has_Destroyed_Gateway then
Logger.Warning ("The gateway object " & Gateway_Full_Name &
" has been destroyed while accepting " &
"changes. Cmvc.Check_In is unable to proceed");
Action.Finish (The_Action => The_Action, Do_Commit => True);
Errors := (Warnings => 0, Errors => 0, Fatal => True);
return;
end if;
end if;
Ro.Release (A_Context => C, Status => S);
Logger.Status (S, Interactive => True);
Errors := (Warnings => 0, Errors => 0, Fatal => False);
exception
when Profile.Error =>
Errors := (Warnings => 0, Errors => 1, Fatal => False);
end Pre_Check_In;
procedure Pre_Cmvc_Copy (Handle : Dc.Gateway_Handle;
Subobject : Directory.Object;
Release : Boolean;
Controlled : Boolean;
Joined : Boolean;
Source_View : Directory.Object;
Destination_View : Directory.Object;
First_Call : Boolean;
Do_Not_Copy : out Boolean;
Response : Profile.Response_Profile;
Action_Id : Action.Id;
Errors : in out Dc.Error_Counts) is
The_Handle : Dc.Gateway_Handle := Reopen (Handle, Action_Id);
C : Ro.Context;
Has_Destroyed_Gateway : Boolean;
S : Ss.Condition;
The_Action : Action.Id := Action_Id;
Gateway_Object : constant Dir.Object :=
Gwo.Directory_Object (The_Handle);
Gateway_Full_Name : constant String :=
Dir.Naming.Get_Full_Name (Gateway_Object);
Host : constant String := Asap.Data_Host (The_Handle);
Model : constant String := Asap.Data_Context (The_Handle) &
Unix.Context_Separator &
Asap.Data_Name (The_Handle);
begin
Profile.Set (Response);
Ro.Acquire (A_Context => C,
Status => S,
Machine => Host,
Instance => Asa_Definitions.Asa);
Logger.Status (S, Interactive => True);
if not Is_Up_To_Date (The_Handle, In_Context => C) then
Logger.Positive ("Accepting changes from model " & Model);
Gwo.Close (The_Handle, S);
Logger.Status (S, Interactive => True);
Accept_Changes (Gateway_Object => Gateway_Object,
In_Context => C,
Model => Model,
Comments => "Automatic Accept_Changes issued by " &
"view copy" & Gateway_Full_Name,
Work_Order => "<DEFAULT>",
Action_Id => Action_Id,
Has_Destroyed_Gateway => Has_Destroyed_Gateway);
end if;
Ro.Release (A_Context => C, Status => S);
Logger.Status (S, Interactive => True);
Errors := (Warnings => 0, Errors => 0, Fatal => False);
Do_Not_Copy := False;
exception
when Profile.Error =>
Errors := (Warnings => 0, Errors => 1, Fatal => False);
Do_Not_Copy := True;
end Pre_Cmvc_Copy;
procedure Post_Cmvc_Copy (Handle : Dc.Gateway_Handle;
Subobject : Directory.Object;
Source_Object : Directory.Object;
Release : Boolean;
Controlled : Boolean;
Joined : Boolean;
Source_View : Directory.Object;
Destination_View : Directory.Object;
First_Call : Boolean;
Response : Profile.Response_Profile;
Action_Id : Action.Id;
Errors : in out Dc.Error_Counts) is
The_Handle : Dc.Gateway_Handle := Reopen (Handle, Action_Id);
Archive_File : Diio.File_Type;
C : Ro.Context;
S : Ss.Condition;
type Access_String is access String;
pragma Segmented_Heap (Access_String);
Context : constant String := Asap.Data_Context (The_Handle);
Host : constant String := Asap.Data_Host (The_Handle);
Model : constant String := Context & Unix.Context_Separator &
Asap.Data_Name (The_Handle);
Gateway_Object : constant Dir.Object :=
Gwo.Directory_Object (The_Handle);
Archive_File_Name : constant String :=
Dna.Get_Full_Name (Gateway_Object) & ".Archive";
Remote_Tarfile : constant String :=
Unix.Temporary_Filename (Unix.Tarfile_Extension);
Cd_Command : constant String := Unix.Change_Directory &
' ' &
Context;
Tar_Command : constant String := Unix.Tape_Archive &
' ' &
Unix.Create &
Unix.Archive_File &
' ' &
Remote_Tarfile &
' ' &
Model;
Rm_Command : constant String := Unix.Remove &
' ' &
Remote_Tarfile;
My_State : Access_String;
procedure Process (State : in out Access_String;
Line : in String) is
begin
pragma Assert (State = null);
State := new String'(Line);
pragma Heap (Job_Segment.Get);
end Process;
procedure Execute_Script is
new Asaopen.Execute (State_Record => Access_String,
Process => Process);
begin
if Release then
Profile.Set (Response);
--
-- Acquire a connection.
--
Ro.Acquire (A_Context => C,
Status => S,
Machine => Host,
Instance => Asa_Definitions.Asa);
Logger.Status (S);
--
-- Find the associated files.
--
Execute_Script (In_Context => C,
Model => Model,
Template_Name => Associated,
State => My_State,
Status => S);
Logger.Status (S);
--
-- Archive all the files, from the appropriate directory.
--
Execute (Command => Cd_Command &
Unix.Command_Separator &
Tar_Command &
' ' &
My_State.all,
Interactive => False,
In_Context => C,
Timeout => Default_Timeout);
--
-- Upload the tar file.
--
Diio.Create (File => Archive_File,
Mode => Diio.Out_File,
Name => Archive_File_Name,
Action_Id => Gwo.Action_Id (The_Handle));
Ro.Get (From_File => Remote_Tarfile,
In_Context => C,
To_File => Archive_File,
Status => S);
Logger.Status (S);
Diio.Close (File => Archive_File);
--
-- Delete the remote tarfile.
--
Execute (Command => Rm_Command,
Interactive => False,
In_Context => C,
Timeout => Default_Timeout);
--
-- Release the connection.
--
Ro.Release (A_Context => C, Status => S);
Logger.Status (S);
end if;
Errors := (Warnings => 0, Errors => 0, Fatal => False);
exception
when Profile.Error =>
Errors := (Warnings => 0, Errors => 1, Fatal => True);
end Post_Cmvc_Copy;
procedure Pre_Make_Controlled (Handle : Dc.Gateway_Handle;
Subobject : Directory.Object;
Save_Source : Boolean;
Allow_Controlled : out Boolean;
Response : Profile.Response_Profile;
Action_Id : Action.Id;
Errors : in out Dc.Error_Counts) is
The_Handle : Dc.Gateway_Handle := Reopen (Handle, Action_Id);
C : Ro.Context;
Has_Destroyed_Gateway : Boolean;
S : Ss.Condition;
The_Action : Action.Id := Action_Id;
Gateway_Object : constant Dir.Object :=
Gwo.Directory_Object (The_Handle);
Gateway_Full_Name : constant String :=
Dir.Naming.Get_Full_Name (Gateway_Object);
Host : constant String := Asap.Data_Host (The_Handle);
Model : constant String := Asap.Data_Context (The_Handle) &
Unix.Context_Separator &
Asap.Data_Name (The_Handle);
begin
Profile.Set (Response);
Allow_Controlled := True;
if Save_Source then
Logger.Negative (Asa_Definitions.Asa &
" gateway objects cannot be source-controlled");
Errors := (Warnings => 0, Errors => 1, Fatal => False);
else
Ro.Acquire (A_Context => C,
Status => S,
Machine => Host,
Instance => Asa_Definitions.Asa);
Logger.Status (S, Interactive => True);
if not Is_Up_To_Date (The_Handle, In_Context => C) then
Logger.Positive ("Accepting changes from model " & Model);
Gwo.Close (The_Handle, S);
Logger.Status (S, Interactive => True);
Accept_Changes
(Gateway_Object => Gateway_Object,
In_Context => C,
Model => Model,
Comments => "Automatic Accept_Changes issued by " &
"Cmvc.Make_Controlled from object " &
Gateway_Full_Name,
Work_Order => "<DEFAULT>",
Action_Id => Action_Id,
Has_Destroyed_Gateway => Has_Destroyed_Gateway);
if Has_Destroyed_Gateway then
Logger.Warning ("The gateway object " & Gateway_Full_Name &
" has been destroyed while accepting " &
"changes. Cmvc.Make_Controlled is " &
"unable to proceed");
Action.Finish (The_Action => The_Action, Do_Commit => True);
Errors := (Warnings => 0, Errors => 0, Fatal => True);
return;
end if;
end if;
Ro.Release (A_Context => C, Status => S);
Logger.Status (S, Interactive => True);
Errors := (Warnings => 0, Errors => 0, Fatal => False);
end if;
exception
when Profile.Error =>
Errors := (Warnings => 0, Errors => 1, Fatal => False);
end Pre_Make_Controlled;
procedure Terminate_Server (Reason : in Dc.Termination_Condition) is
begin
if Reason = Dc.Gateway_Class_Deactivated then
Switch_Registration.Stop;
end if;
end Terminate_Server;
end Model;