----------------------------------------------------------------------- -- ado-cache -- Simple cache management -- Copyright (C) 2017 Stephane Carrez -- Written by Stephane Carrez (Stephane.Carrez@gmail.com) -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- -- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- See the License for the specific language governing permissions and -- limitations under the License. ----------------------------------------------------------------------- with Ada.Unchecked_Deallocation; package body ADO.Caches is -- -------------------- -- Expand the name from the given group into a target parameter value to be used in -- the SQL query. The expander can look in a cache or in some configuration to find -- the value associated with the name and return it. The Expander can return a -- T_NULL when a value is not found or it may also raise some exception. -- -------------------- overriding function Expand (Instance : in Cache_Manager; Group : in String; Name : in String) return ADO.Parameters.Parameter is use type Ada.Strings.Unbounded.Unbounded_String; C : Cache_Type_Access := Instance.First; begin while C /= null loop if C.Name = Group then return C.Expand (Name); end if; C := C.Next; end loop; Log.Warn ("There is no group {0} registered in the cache manager", Group); raise No_Value with "No group '" & Group & "'"; end Expand; -- -------------------- -- Insert a new cache in the manager. The cache is identified by the given name. -- -------------------- procedure Add_Cache (Manager : in out Cache_Manager; Name : in String; Cache : in Cache_Type_Access) is begin Log.Debug ("Adding cache group {0}", Name); Cache.Next := Manager.First; Cache.Name := Ada.Strings.Unbounded.To_Unbounded_String (Name); Manager.First := Cache; end Add_Cache; -- -------------------- -- Finalize the cache manager releasing every cache group. -- -------------------- overriding procedure Finalize (Manager : in out Cache_Manager) is procedure Free is new Ada.Unchecked_Deallocation (Object => Cache_Type'Class, Name => Cache_Type_Access); Cache : Cache_Type_Access; begin loop Cache := Manager.First; exit when Cache = null; Manager.First := Cache.Next; Free (Cache); end loop; end Finalize; end ADO.Caches;