1------------------------------------------------------------------------------
2--                                                                          --
3--                            Matreshka Project                             --
4--                                                                          --
5--                           SQL Database Access                            --
6--                                                                          --
7--                        Runtime Library Component                         --
8--                                                                          --
9------------------------------------------------------------------------------
10--                                                                          --
11-- Copyright © 2011-2014, Vadim Godunko <vgodunko@gmail.com>                --
12-- All rights reserved.                                                     --
13--                                                                          --
14-- Redistribution and use in source and binary forms, with or without       --
15-- modification, are permitted provided that the following conditions       --
16-- are met:                                                                 --
17--                                                                          --
18--  * Redistributions of source code must retain the above copyright        --
19--    notice, this list of conditions and the following disclaimer.         --
20--                                                                          --
21--  * Redistributions in binary form must reproduce the above copyright     --
22--    notice, this list of conditions and the following disclaimer in the   --
23--    documentation and/or other materials provided with the distribution.  --
24--                                                                          --
25--  * Neither the name of the Vadim Godunko, IE nor the names of its        --
26--    contributors may be used to endorse or promote products derived from  --
27--    this software without specific prior written permission.              --
28--                                                                          --
29-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS      --
30-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT        --
31-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR    --
32-- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT     --
33-- HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,   --
34-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED --
35-- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR   --
36-- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF   --
37-- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING     --
38-- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS       --
39-- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.             --
40--                                                                          --
41------------------------------------------------------------------------------
42--  $Revision: 4982 $ $Date: 2014-11-04 13:25:16 +0300 (Tue, 04 Nov 2014) $
43------------------------------------------------------------------------------
44with Interfaces.C;
45with System;
46
47with Matreshka.Internals.Utf16;
48
49package Matreshka.Internals.SQL_Drivers.Oracle is
50
51   --  Options supported by driver:
52   Database_Option : constant League.Strings.Universal_String
53     := League.Strings.To_Universal_String ("database");
54   Password_Option : constant League.Strings.Universal_String
55     := League.Strings.To_Universal_String ("password");
56   User_Option     : constant League.Strings.Universal_String
57     := League.Strings.To_Universal_String ("user");
58
59   --  Low level Oracle Call interface binding below this line.
60
61   subtype Address is System.Address;
62   Null_Address : constant Address := System.Null_Address;
63
64   subtype Size_T is Interfaces.C.size_t;
65
66   subtype Sword is Interfaces.C.int;
67   subtype Ub4 is Interfaces.Unsigned_32;
68   subtype Ub2 is Interfaces.Unsigned_16;
69   subtype Ub1 is Interfaces.Unsigned_8;
70   subtype Sb1 is Interfaces.Integer_8;
71   subtype Sb2 is Interfaces.C.short;
72
73   subtype Ora_Text is Interfaces.C.char_array;
74
75   type Ub4_Ptr is access all Ub4;
76   type Sb2_Ptr is access all Sb2;
77
78   type Error_Code is new Sword;
79
80   OCI_SUCCESS           : constant Error_Code := 0;
81   OCI_SUCCESS_WITH_INFO : constant Error_Code := 1;
82   OCI_NEED_DATA         : constant Error_Code := 99;
83   OCI_NO_DATA           : constant Error_Code := 100;
84   OCI_ERROR             : constant Error_Code := -1;
85   OCI_INVALID_HANDLE    : constant Error_Code := -2;
86   OCI_STILL_EXECUTING   : constant Error_Code := -3123;
87   OCI_CONTINUE          : constant Error_Code := -24200;
88
89   type Handle_Type is new Ub4;
90
91   OCI_HTYPE_ENV     : constant Handle_Type := 1;
92   OCI_HTYPE_ERROR   : constant Handle_Type := 2;
93   OCI_HTYPE_SVCCTX  : constant Handle_Type := 3;
94   OCI_HTYPE_STMT    : constant Handle_Type := 4;
95   OCI_DTYPE_PARAM   : constant Handle_Type := 53;
96   OCI_DTYPE_TIMESTAMP     : constant Handle_Type := 68;
97   OCI_DTYPE_TIMESTAMP_TZ  : constant Handle_Type := 69;
98   OCI_DTYPE_TIMESTAMP_LTZ : constant Handle_Type := 70;
99
100   type Data_Type is new Ub2;
101
102   SQLT_CHR           : constant Data_Type := 1;
103   SQLT_NUM           : constant Data_Type := 2;
104   SQLT_INT           : constant Data_Type := 3;
105   SQLT_FLT           : constant Data_Type := 4;
106   SQLT_STR           : constant Data_Type := 5;
107   SQLT_VNU           : constant Data_Type := 6;
108   SQLT_VCS           : constant Data_Type := 9;
109   SQLT_DAT           : constant Data_Type := 12;
110   SQLT_BFLOAT        : constant Data_Type := 21;
111   SQLT_BDOUBLE       : constant Data_Type := 22;
112   SQLT_AFC           : constant Data_Type := 96;
113   SQLT_IBFLOAT       : constant Data_Type := 100;
114   SQLT_IBDOUBLE      : constant Data_Type := 101;
115   SQLT_ODT           : constant Data_Type := 156;
116   SQLT_TIMESTAMP     : constant Data_Type := 187;
117   SQLT_TIMESTAMP_TZ  : constant Data_Type := 188;
118   SQLT_INTERVAL_YM   : constant Data_Type := 189;
119   SQLT_INTERVAL_DS   : constant Data_Type := 190;
120   SQLT_TIMESTAMP_LTZ : constant Data_Type := 232;
121
122   type Internal is limited private;
123
124   type Handle is access all Internal;
125   pragma Convention (C, Handle);
126
127   subtype Environment      is Handle;
128   subtype Error_Handle     is Handle;
129   subtype Parameter        is Handle;
130   subtype Date_Time        is Handle;
131   subtype Service_Handle   is Handle;
132   subtype Statement_Handle is Handle;
133
134   type Bind is access all Internal;
135   pragma Convention (C, Bind);
136
137   type Define is access all Internal;
138   pragma Convention (C, Define);
139
140   OCI_ATTR_DATA_SIZE      : constant Ub4 := 1;
141   OCI_ATTR_DATA_TYPE      : constant Ub4 := 2;
142   OCI_ATTR_NAME           : constant Ub4 := 4;
143   OCI_ATTR_PRECISION      : constant Ub4 := 5;
144   OCI_ATTR_SCALE          : constant Ub4 := 6;
145   OCI_ATTR_PARAM_COUNT    : constant Ub4 := 18;
146   OCI_ATTR_STMT_TYPE      : constant Ub4 := 24;
147   OCI_ATTR_CHARSET_ID     : constant Ub4 := 31;
148   OCI_ATTR_PTYPE          : constant Ub4 := 123;
149   OCI_ATTR_CHAR_USED      : constant Ub4 := 285;
150   OCI_ATTR_CHAR_SIZE      : constant Ub4 := 286;
151
152   type Env_Mode is new Ub4;
153
154   OCI_DEFAULT  : constant          := 16#000#;
155   OCI_THREADED : constant Env_Mode := 16#001#;
156   OCI_OBJECT   : constant Env_Mode := 16#002#;
157   OCI_EVENTS   : constant Env_Mode := 16#004#;
158   OCI_SHARED   : constant Env_Mode := 16#010#;
159
160   OCI_UTF16ID : constant := 1000;
161
162   OCI_STMT_UNKNOWN : constant Ub2 := 0;   --  Unknown statement
163   OCI_STMT_SELECT  : constant Ub2 := 1;   --  select statement
164   OCI_STMT_UPDATE  : constant Ub2 := 2;   --  update statement
165   OCI_STMT_DELETE  : constant Ub2 := 3;   --  delete statement
166   OCI_STMT_INSERT  : constant Ub2 := 4;   --  Insert Statement
167   OCI_STMT_CREATE  : constant Ub2 := 5;   --  create statement
168   OCI_STMT_DROP    : constant Ub2 := 6;   --  drop statement
169   OCI_STMT_ALTER   : constant Ub2 := 7;   --  alter statement
170   OCI_STMT_BEGIN   : constant Ub2 := 8;   --  begin ... (pl/sql statement)
171   OCI_STMT_DECLARE : constant Ub2 := 9;   --  declare .. (pl/sql statement)
172   OCI_STMT_CALL    : constant Ub2 := 10;  --  corresponds to kpu call
173
174   OCI_DATA_AT_EXEC : constant Ub4 := 2;  --  data at execute time
175
176   function OCIHandleAlloc
177    (Parent      : Environment;
178     Target      : access Handle;
179     Target_Type : Handle_Type;
180     Extra_Sz    : Size_T := 0;
181     Extra_Ptr   : Address := Null_Address) return Error_Code;
182   pragma Import (C, OCIHandleAlloc, "OCIHandleAlloc");
183
184   function OCIHandleFree
185    (Target      : Handle;
186     Target_Type : Handle_Type) return Error_Code;
187   pragma Import (C, OCIHandleFree, "OCIHandleFree");
188
189   function OCIDescriptorAlloc
190    (Parent      : Environment;
191     Target      : access Handle;
192     Target_Type : Handle_Type;
193     Extra_Sz    : Size_T := 0;
194     Extra_Ptr   : Address := Null_Address) return Error_Code;
195   pragma Import (C, OCIDescriptorAlloc, "OCIDescriptorAlloc");
196
197   function OCIAttrGet
198    (Target      : Handle;
199     Target_Type : Handle_Type;
200     Buffer      : Address;
201     Length      : Ub4_Ptr;
202     Attr        : Ub4;
203     Error       : Error_Handle) return Error_Code;
204   pragma Import (C, OCIAttrGet, "OCIAttrGet");
205
206   function OCIDescriptorFree
207    (Target      : Handle;
208     Target_Type : Handle_Type) return Error_Code;
209   pragma Import (C, OCIDescriptorFree, "OCIDescriptorFree");
210
211   function OCIParamGet
212    (Target      : Handle;
213     Target_Type : Handle_Type;
214     Error       : Error_Handle;
215     Result      : access Parameter;
216     Position    : Ub4) return Error_Code;
217   pragma Import (C, OCIParamGet, "OCIParamGet");
218
219   function OCIEnvNlsCreate
220    (Target    : access Environment;
221     Mode      : Env_Mode;
222     Ctxp      : Address := Null_Address;
223     Malocfp   : Address := Null_Address;
224     Ralocfp   : Address := Null_Address;
225     Mfreefp   : Address := Null_Address;
226     Extra_Sz  : Size_T := 0;
227     Extra_Ptr : Address := Null_Address;
228     Charset   : Ub2 := OCI_UTF16ID;
229     N_Charset : Ub2 := OCI_UTF16ID) return Error_Code;
230   pragma Import (C, OCIEnvNlsCreate, "OCIEnvNlsCreate");
231
232   function OCILogon
233    (Env          : Environment;
234     Error        : Error_Handle;
235     Target       : access Service_Handle;
236     Username     : Matreshka.Internals.Utf16.Utf16_String;
237     Username_Len : Ub4;
238     Password     : Matreshka.Internals.Utf16.Utf16_String;
239     Passwd_Len   : Ub4;
240     Dbname       : Matreshka.Internals.Utf16.Utf16_String;
241     Dbname_Len   : Ub4) return Error_Code;
242   pragma Import (C, OCILogon, "OCILogon");
243
244   function OCILogoff
245    (Target : Service_Handle; Error : Error_Handle) return Error_Code;
246   pragma Import (C, OCILogoff, "OCILogoff");
247
248   function OCITransCommit
249    (Target : Service_Handle;
250     Error  : Error_Handle;
251     Flags  : Ub4 := OCI_DEFAULT) return Error_Code;
252   pragma Import (C, OCITransCommit, "OCITransCommit");
253
254   function OCITransRollback
255    (Target : Service_Handle;
256     Error  : Error_Handle;
257     Flags  : Ub4 := OCI_DEFAULT) return Error_Code;
258   pragma Import (C, OCITransRollback, "OCITransRollback");
259
260   function OCIErrorGet
261    (Error       : Error_Handle;
262     Record_No   : Ub4;
263     Sql_State   : Address := Null_Address;
264     Ora_Code    : access Ub4;
265     Buffer      : Matreshka.Internals.Utf16.Utf16_String;
266     Buffer_Size : Ub4;
267     H_Type      : Handle_Type := OCI_HTYPE_ERROR) return Error_Code;
268   pragma Import (C, OCIErrorGet, "OCIErrorGet");
269
270   function OCIStmtPrepare
271    (Stmt        : Statement_Handle;
272     Error       : Error_Handle;
273     Text        : Matreshka.Internals.Utf16.Utf16_String;
274     Text_Length : Ub4;
275     Language    : Ub4 := 1;
276     Mode        : Ub4 := 0) return Error_Code;
277   pragma Import (C, OCIStmtPrepare, "OCIStmtPrepare");
278
279   function OCIStmtExecute
280    (Service  : Service_Handle;
281     Stmt     : Statement_Handle;
282     Errhp    : Error_Handle;
283     Iters    : Ub4;
284     Row_Off  : Ub4 := 0;
285     Snap_In  : Address := Null_Address;
286     Snap_Out : Address := Null_Address;
287     Mode     : Ub4 := 0) return Error_Code;
288   pragma Import (C, OCIStmtExecute, "OCIStmtExecute");
289
290   function OCIStmtFetch2
291    (Stmt        : Statement_Handle;
292     Error       : Error_Handle;
293     Rows        : Ub4 := 1;
294     Orientation : Ub2 := OCI_DEFAULT;
295     Offset      : Ub4 := 0;
296     Mode        : Ub4 := OCI_DEFAULT) return Error_Code;
297   pragma Import (C, OCIStmtFetch2,    "OCIStmtFetch2");
298
299   function OCIBindByName
300    (Stmt         : Statement_Handle;
301     Target       : access Bind;
302     Error        : Error_Handle;
303     Place        : Matreshka.Internals.Utf16.Utf16_String;
304     Place_Length : Ub4;
305     Value        : Address := Null_Address;
306     Value_Length : Ub4;
307     Value_Type   : Data_Type;
308     Indicator    : Sb2_Ptr := null;
309     Array_Length : Address := Null_Address;
310     Rcodep       : Address := Null_Address;
311     Max_Array    : Ub4 := 0;
312     Curelep      : Address := Null_Address;
313     Mode         : Ub4 := 0) return Error_Code;
314   pragma Import (C, OCIBindByName,  "OCIBindByName");
315
316   function OCIBindByPos
317    (Stmt         : Statement_Handle;
318     Target       : access Bind;
319     Error        : Error_Handle;
320     Position     : Ub4;
321     Value        : Address := Null_Address;
322     Value_Length : Ub4;
323     Value_Type   : Data_Type;
324     Indicator    : Sb2_Ptr := null;
325     Array_Length : Address := Null_Address;
326     Rcodep       : Address := Null_Address;
327     Max_Array    : Ub4 := 0;
328     Curelep      : Address := Null_Address;
329     Mode         : Ub4 := 0) return Error_Code;
330   pragma Import (C, OCIBindByPos, "OCIBindByPos");
331
332   function OCIDefineByPos
333    (Stmt         : Statement_Handle;
334     Target       : access Define;
335     Error        : Error_Handle;
336     Position     : Ub4;
337     Value        : Address;
338     Value_Length : Ub4;
339     Value_Type   : Data_Type;
340     Indicator    : access Sb2;
341     Array_Length : Address := Null_Address;
342     Rcodep       : Address := Null_Address;
343     Mode         : Ub4 := 0) return Error_Code;
344   pragma Import (C, OCIDefineByPos, "OCIDefineByPos");
345
346   function OCINlsCharSetIdToName
347    (Env        : Environment;
348     Buffer     : Ora_Text;
349     Buffer_Len : Size_T;
350     Id         : Ub2) return Error_Code;
351   pragma Import (C, OCINlsCharSetIdToName, "OCINlsCharSetIdToName");
352
353   function OCINlsNameMap
354    (Env        : Environment;
355     Buffer     : Ora_Text;
356     Buffer_Len : Size_T;
357     Source     : Ora_Text;
358     Flag       : Sword) return Error_Code;
359   pragma Import (C, OCINlsNameMap, "OCINlsNameMap");
360
361   function OCIDateTimeGetDate
362    (Env   : Environment;
363     Error : Error_Handle;
364     Date  : Date_Time;
365     Year  : access Sb2;
366     Month : access Ub1;
367     Day   : access Ub1) return Error_Code;
368   pragma Import (C, OCIDateTimeGetDate, "OCIDateTimeGetDate");
369
370   function OCIDateTimeGetTime
371    (Env   : Environment;
372     Error : Error_Handle;
373     Date  : Date_Time;
374     Hour  : access Ub1;
375     Min   : access Ub1;
376     Sec   : access Ub1;
377     Fract : access Ub4) return Error_Code;
378   pragma Import (C, OCIDateTimeGetTime, "OCIDateTimeGetTime");
379
380   function OCIDateTimeConstruct
381    (Env    : Environment;
382     Error  : Error_Handle;
383     Date   : Date_Time;
384     Year   : Sb2;
385     Month  : Ub1;
386     Day    : Ub1;
387     Hour   : Ub1;
388     Min    : Ub1;
389     Sec    : Ub1;
390     Fract  : Ub4;
391     TZ     : Address := Null_Address;
392     TZ_Len : Size_T := 0) return Error_Code;
393   pragma Import (C, OCIDateTimeConstruct, "OCIDateTimeConstruct");
394
395
396   OCI_ONE_PIECE   : constant Ub1 := 0;
397   OCI_FIRST_PIECE : constant Ub1 := 1;
398   OCI_NEXT_PIECE  : constant Ub1 := 2;
399   OCI_LAST_PIECE  : constant Ub1 := 3;
400
401   function OCIBindDynamic
402     (bindp : Bind;
403      Error : Error_Handle;
404      ictxp : Address;
405      icbfp : Address;
406      octxp : Address;
407      ocbfp : Address) return Error_Code;
408   pragma Import (C, OCIBindDynamic, "OCIBindDynamic");
409
410private
411
412   type Internal is limited null record;
413
414end Matreshka.Internals.SQL_Drivers.Oracle;
415