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