gnatcoll_sqlite_22.0.0_ffe1c7ec/pgxs/source/pgxs-return_sets.adb

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
------------------------------------------------------------------------------
--               PostgreSQL server extension modules binding                --
--                                                                          --
--                       Copyright (C) 2020, AdaCore                        --
--                                                                          --
-- This library is free software;  you can redistribute it and/or modify it --
-- under terms of the  GNU General Public License  as published by the Free --
-- Software  Foundation;  either version 3,  or (at your  option) any later --
-- version. This library is distributed in the hope that it will be useful, --
-- but WITHOUT ANY WARRANTY;  without even the implied warranty of MERCHAN- --
-- TABILITY or FITNESS FOR A PARTICULAR PURPOSE.                            --
--                                                                          --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception,   --
-- version 3.1, as published by the Free Software Foundation.               --
--                                                                          --
-- You should have received a copy of the GNU General Public License and    --
-- a copy of the GCC Runtime Library Exception along with this program;     --
-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
-- <http://www.gnu.org/licenses/>.                                          --
--                                                                          --
------------------------------------------------------------------------------

with System.Address_To_Access_Conversions;

package body PGXS.Return_Sets is

   ---------------------------------
   -- Generic_Set_Return_Function --
   ---------------------------------

   function Generic_Set_Return_Function
     (Args : in out PGXS.Function_Call_Info) return PGXS.Datum
   is

      use type System.Address;

      package Conversions is
        new System.Address_To_Access_Conversions (User_Data);

      function Is_First_Call
        (Args : PGXS.Function_Call_Info) return PGXS.Types.Bool
        with Import, Convention => C, Link_Name => "__ada_SRF_IS_FIRSTCALL";

      function First_Call_Init
        (Args : PGXS.Function_Call_Info) return PGXS.Func_Call_Context
        with Import, Convention => C, Link_Name => "__ada_SRF_FIRSTCALL_INIT";

      function Per_Call_Setup
        (Args : PGXS.Function_Call_Info) return PGXS.Func_Call_Context
        with Import, Convention => C, Link_Name => "__ada_SRF_PERCALL_SETUP";

      function Get_Memory_Context
        (Context : PGXS.Func_Call_Context) return PGXS.Memory_Context
        with Import,
             Convention => C,
             Link_Name => "__ada_PG_FuncCallContext_get_multi_call_memory_ctx";

      function Get_User_Data
        (Context : PGXS.Func_Call_Context) return System.Address
        with Import,
             Convention => C,
             Link_Name => "__ada_PG_FuncCallContext_get_user_fctx";

      procedure Set_User_Data
        (Context : PGXS.Func_Call_Context;
         To      : System.Address)
        with Import,
             Convention => C,
             Link_Name => "__ada_PG_FuncCallContext_set_user_fctx";

      function Memory_Context_Switch_To
        (Context : PGXS.Memory_Context) return PGXS.Memory_Context
        with Import,
             Convention => C,
             Link_Name => "__ada_MemoryContextSwitchTo";

      procedure Memory_Context_Switch_To (Context : PGXS.Memory_Context)
        with Import,
             Convention => C,
             Link_Name => "__ada_MemoryContextSwitchTo";

      Func_Context : PGXS.Func_Call_Context;
      Data         : User_Data_Access;
      Old          : PGXS.Memory_Context;

   begin
      if Is_First_Call (Args) then
         Func_Context := First_Call_Init (Args);
         Old := Memory_Context_Switch_To (Get_Memory_Context (Func_Context));
         First_Initialize (Args, Func_Context, Data);
         Set_User_Data
           (Func_Context,
            Conversions.To_Address (Conversions.Object_Pointer (Data)));
         Memory_Context_Switch_To (Old);
      end if;

      Func_Context := Per_Call_Setup (Args);

      if Get_User_Data (Func_Context) /= System.Null_Address then
         Data :=
           Conversions.To_Pointer
             (Get_User_Data (Func_Context)).all'Unchecked_Access;

      else
         Data := null;
      end if;

      Step_Initialize (Args, Func_Context, Data);

      return Step (Args, Func_Context, Data);
   end Generic_Set_Return_Function;

end PGXS.Return_Sets;