----------------------------------------------------------------------- -- ado-schemas-databases -- Database creation and upgrade -- Copyright (C) 2018, 2022 Stephane Carrez -- Written by Stephane Carrez (Stephane.Carrez@gmail.com) -- SPDX-License-Identifier: Apache-2.0 ----------------------------------------------------------------------- with Ada.Containers.Doubly_Linked_Lists; with Util.Strings.Vectors; with ADO.Sessions.Sources; package ADO.Schemas.Databases is subtype UString is Ada.Strings.Unbounded.Unbounded_String; type Upgrade_Type is record Version : Positive; Name : UString; Depend : UString; Path : UString; end record; -- Compare two upgrade records and tell whether Left must be run before Right. function "<" (Left, Right : in Upgrade_Type) return Boolean; package Upgrade_Lists is new Ada.Containers.Doubly_Linked_Lists (Upgrade_Type); subtype Upgrade_List is Upgrade_Lists.List; -- Create the database and initialize it with the schema SQL file. -- The `Admin` parameter describes the database connection with administrator access. -- The `Config` parameter describes the target database connection: this is the -- database that must be created and configured. The `Schema_Path` is the path -- of the SQL file that can be used to populate the database with the schema. -- The `Messages` vector will contain the messages produced during the setup and -- configuration of the database. -- -- For the `sqlite` driver, the `Admin` parameter is not used. procedure Create_Database (Admin : in ADO.Sessions.Sources.Data_Source'Class; Config : in ADO.Sessions.Sources.Data_Source'Class; Schema_Path : in String; Messages : out Util.Strings.Vectors.Vector); -- Scan the directory for migration script and check with the database to define -- the database upgrade scripts that must be executed. The result list must then -- be sorted by using `Sort_Migration` to honor the module dependencies. procedure Scan_Migration (Session : in ADO.Sessions.Session'Class; Path : in String; Result : in out Upgrade_List); -- Sort the list of upgrade directories depending on the module dependencies. procedure Sort_Migration (List : in out Upgrade_List); -- Prepare the database migration described by the `Upgrade` record. -- Collect the SQL files according to the current database driver, -- sort them and return the list of absolute pathes in `Files`. procedure Prepare_Migration (Session : in ADO.Sessions.Session'Class; Upgrade : in Upgrade_Type; Files : in out Util.Strings.Vectors.Vector); -- Run the database migration scripts described by the `Upgrade` record. -- If the `Files` is not empty and matches the `Upgrade` path, the list of -- files is used to perform the database migration. Otherwise, `Prepare_Migration` -- is executed. For each SQL file, read and execute each SQL statement -- by executing the `Execute` procedure. At the end, the version associated -- with the module is updated to match the value defined in `Upgrade`. procedure Run_Migration (Session : in ADO.Sessions.Master_Session'Class; Upgrade : in Upgrade_Type; Files : in out Util.Strings.Vectors.Vector; Execute : not null access procedure (Session : in ADO.Sessions.Session'Class; SQL : in String)); end ADO.Schemas.Databases;