1--  This file is covered by the Internet Software Consortium (ISC) License
2--  Reference: ../../License.txt
3
4with CommonText;
5with AdaBase.Connection.Base;
6with AdaBase.Interfaces.Statement;
7with AdaBase.Logger.Facility;
8with AdaBase.Results.Sets;
9with AdaBase.Results.Field;
10with AdaBase.Results.Converters;
11with AdaBase.Results.Generic_Converters;
12with Ada.Calendar.Formatting;
13with Ada.Characters.Handling;
14with Ada.Containers.Indefinite_Hashed_Maps;
15with Ada.Containers.Vectors;
16with Ada.Strings.Hash;
17with Ada.Strings.Wide_Unbounded;
18with Ada.Strings.Wide_Wide_Unbounded;
19with Ada.Characters.Conversions;
20with Ada.Unchecked_Deallocation;
21with Spatial_Data.Well_Known_Binary;
22
23package AdaBase.Statement.Base is
24
25   package CT  renames CommonText;
26   package SUW renames Ada.Strings.Wide_Unbounded;
27   package SWW renames Ada.Strings.Wide_Wide_Unbounded;
28   package CAL renames Ada.Calendar;
29   package CFM renames Ada.Calendar.Formatting;
30   package ACC renames Ada.Characters.Conversions;
31   package AR  renames AdaBase.Results;
32   package ACB renames AdaBase.Connection.Base;
33   package AIS renames AdaBase.Interfaces.Statement;
34   package ALF renames AdaBase.Logger.Facility;
35   package ARC renames AdaBase.Results.Converters;
36   package RGC renames AdaBase.Results.Generic_Converters;
37   package ARF renames AdaBase.Results.Field;
38   package ARS renames AdaBase.Results.Sets;
39   package ACH renames Ada.Characters.Handling;
40   package GEO renames Spatial_Data;
41   package WKB renames Spatial_Data.Well_Known_Binary;
42
43
44   type SQL_Access is access all String;
45
46   type Base_Statement is
47     abstract new Base_Pure and AIS.iStatement with private;
48   type Basic_Statement is access all Base_Statement'Class;
49
50   type Stmt_Type is (direct_statement, prepared_statement);
51
52   ILLEGAL_BIND_SQL         : exception;
53   INVALID_FOR_DIRECT_QUERY : exception;
54   INVALID_FOR_RESULT_SET   : exception;
55   INVALID_COLUMN_INDEX     : exception;
56   PRIOR_EXECUTION_FAILED   : exception;
57   BINDING_COLUMN_NOT_FOUND : exception;
58   BINDING_TYPE_MISMATCH    : exception;
59   BINDING_SIZE_MISMATCH    : exception;
60   STMT_PREPARATION         : exception;
61   STMT_EXECUTION           : exception;
62   MARKER_NOT_FOUND         : exception;
63
64   overriding
65   function rows_affected (Stmt : Base_Statement) return Affected_Rows;
66
67   overriding
68   function successful (Stmt : Base_Statement) return Boolean;
69
70   overriding
71   function data_discarded (Stmt : Base_Statement) return Boolean;
72
73   overriding
74   procedure iterate (Stmt    : out Base_Statement;
75                      process : not null access procedure);
76
77   overriding
78   procedure iterate (Stmt    : out Base_Statement;
79                      process : not null access procedure (row : ARS.Datarow));
80
81
82   -------------------------------------------
83   --      23 bind using integer index      --
84   -------------------------------------------
85   procedure bind (Stmt  : out Base_Statement;
86                   index : Positive;
87                   vaxx  : AR.NByte0_Access);
88
89   procedure bind (Stmt  : out Base_Statement;
90                   index : Positive;
91                   vaxx  : AR.NByte1_Access);
92
93   procedure bind (Stmt  : out Base_Statement;
94                   index : Positive;
95                   vaxx  : AR.NByte2_Access);
96
97   procedure bind (Stmt  : out Base_Statement;
98                   index : Positive;
99                   vaxx  : AR.NByte3_Access);
100
101   procedure bind (Stmt  : out Base_Statement;
102                   index : Positive;
103                   vaxx  : AR.NByte4_Access);
104
105   procedure bind (Stmt  : out Base_Statement;
106                   index : Positive;
107                   vaxx  : AR.NByte8_Access);
108
109   procedure bind (Stmt  : out Base_Statement;
110                   index : Positive;
111                   vaxx  : AR.Byte1_Access);
112
113   procedure bind (Stmt  : out Base_Statement;
114                   index : Positive;
115                   vaxx  : AR.Byte2_Access);
116
117   procedure bind (Stmt  : out Base_Statement;
118                   index : Positive;
119                   vaxx  : AR.Byte3_Access);
120
121   procedure bind (Stmt  : out Base_Statement;
122                   index : Positive;
123                   vaxx  : AR.Byte4_Access);
124
125   procedure bind (Stmt  : out Base_Statement;
126                   index : Positive;
127                   vaxx  : AR.Byte8_Access);
128
129   procedure bind (Stmt  : out Base_Statement;
130                   index : Positive;
131                   vaxx  : AR.Real9_Access);
132
133   procedure bind (Stmt  : out Base_Statement;
134                   index : Positive;
135                   vaxx  : AR.Real18_Access);
136
137   procedure bind (Stmt  : out Base_Statement;
138                   index : Positive;
139                   vaxx  : AR.Str1_Access);
140
141   procedure bind (Stmt  : out Base_Statement;
142                   index : Positive;
143                   vaxx  : AR.Str2_Access);
144
145   procedure bind (Stmt  : out Base_Statement;
146                   index : Positive;
147                   vaxx  : AR.Str4_Access);
148
149   procedure bind (Stmt  : out Base_Statement;
150                   index : Positive;
151                   vaxx  : AR.Time_Access);
152
153   procedure bind (Stmt  : out Base_Statement;
154                   index : Positive;
155                   vaxx  : AR.Chain_Access);
156
157   procedure bind (Stmt  : out Base_Statement;
158                   index : Positive;
159                   vaxx  : AR.Enum_Access);
160
161   procedure bind (Stmt  : out Base_Statement;
162                   index : Positive;
163                   vaxx  : AR.Settype_Access);
164
165   procedure bind (Stmt  : out Base_Statement;
166                   index : Positive;
167                   vaxx  : AR.Bits_Access);
168
169   procedure bind (Stmt  : out Base_Statement;
170                   index : Positive;
171                   vaxx  : AR.S_UTF8_Access);
172
173   procedure bind (Stmt  : out Base_Statement;
174                   index : Positive;
175                   vaxx  : AR.Geometry_Access);
176
177
178   -------------------------------------------
179   --    23 bind using header for index     --
180   -------------------------------------------
181   procedure bind (Stmt    : out Base_Statement;
182                   heading : String;
183                   vaxx    : AR.NByte0_Access);
184
185   procedure bind (Stmt    : out Base_Statement;
186                   heading : String;
187                   vaxx    : AR.NByte1_Access);
188
189   procedure bind (Stmt    : out Base_Statement;
190                   heading : String;
191                   vaxx    : AR.NByte2_Access);
192
193   procedure bind (Stmt    : out Base_Statement;
194                   heading : String;
195                   vaxx    : AR.NByte3_Access);
196
197   procedure bind (Stmt    : out Base_Statement;
198                   heading : String;
199                   vaxx    : AR.NByte4_Access);
200
201   procedure bind (Stmt    : out Base_Statement;
202                   heading : String;
203                   vaxx    : AR.NByte8_Access);
204
205   procedure bind (Stmt    : out Base_Statement;
206                   heading : String;
207                   vaxx    : AR.Byte1_Access);
208
209   procedure bind (Stmt    : out Base_Statement;
210                   heading : String;
211                   vaxx    : AR.Byte2_Access);
212
213   procedure bind (Stmt    : out Base_Statement;
214                   heading : String;
215                   vaxx    : AR.Byte3_Access);
216
217   procedure bind (Stmt    : out Base_Statement;
218                   heading : String;
219                   vaxx    : AR.Byte4_Access);
220
221   procedure bind (Stmt    : out Base_Statement;
222                   heading : String;
223                   vaxx    : AR.Byte8_Access);
224
225   procedure bind (Stmt    : out Base_Statement;
226                   heading : String;
227                   vaxx    : AR.Real9_Access);
228
229   procedure bind (Stmt    : out Base_Statement;
230                   heading : String;
231                   vaxx    : AR.Real18_Access);
232
233   procedure bind (Stmt    : out Base_Statement;
234                   heading : String;
235                   vaxx    : AR.Str1_Access);
236
237   procedure bind (Stmt    : out Base_Statement;
238                   heading : String;
239                   vaxx    : AR.Str2_Access);
240
241   procedure bind (Stmt    : out Base_Statement;
242                   heading : String;
243                   vaxx    : AR.Str4_Access);
244
245   procedure bind (Stmt    : out Base_Statement;
246                   heading : String;
247                   vaxx    : AR.Time_Access);
248
249   procedure bind (Stmt    : out Base_Statement;
250                   heading : String;
251                   vaxx    : AR.Chain_Access);
252
253   procedure bind (Stmt    : out Base_Statement;
254                   heading : String;
255                   vaxx    : AR.Enum_Access);
256
257   procedure bind (Stmt    : out Base_Statement;
258                   heading : String;
259                   vaxx    : AR.Settype_Access);
260
261   procedure bind (Stmt    : out Base_Statement;
262                   heading : String;
263                   vaxx    : AR.Bits_Access);
264
265   procedure bind (Stmt    : out Base_Statement;
266                   heading : String;
267                   vaxx    : AR.S_UTF8_Access);
268
269   procedure bind (Stmt    : out Base_Statement;
270                   heading : String;
271                   vaxx    : AR.Geometry_Access);
272
273
274   --------------------------------------------
275   --  23 assign/access using integer index  --
276   --------------------------------------------
277   procedure assign (Stmt  : out Base_Statement;
278                     index : Positive;
279                     vaxx  : AR.NByte0_Access);
280
281   procedure assign (Stmt  : out Base_Statement;
282                     index : Positive;
283                     vaxx  : AR.NByte1_Access);
284
285   procedure assign (Stmt  : out Base_Statement;
286                     index : Positive;
287                     vaxx  : AR.NByte2_Access);
288
289   procedure assign (Stmt  : out Base_Statement;
290                     index : Positive;
291                     vaxx  : AR.NByte3_Access);
292
293   procedure assign (Stmt  : out Base_Statement;
294                     index : Positive;
295                     vaxx  : AR.NByte4_Access);
296
297   procedure assign (Stmt  : out Base_Statement;
298                     index : Positive;
299                     vaxx  : AR.NByte8_Access);
300
301   procedure assign (Stmt  : out Base_Statement;
302                     index : Positive;
303                     vaxx  : AR.Byte1_Access);
304
305   procedure assign (Stmt  : out Base_Statement;
306                     index : Positive;
307                     vaxx  : AR.Byte2_Access);
308
309   procedure assign (Stmt  : out Base_Statement;
310                     index : Positive;
311                     vaxx  : AR.Byte3_Access);
312
313   procedure assign (Stmt  : out Base_Statement;
314                     index : Positive;
315                     vaxx  : AR.Byte4_Access);
316
317   procedure assign (Stmt  : out Base_Statement;
318                     index : Positive;
319                     vaxx  : AR.Byte8_Access);
320
321   procedure assign (Stmt  : out Base_Statement;
322                     index : Positive;
323                     vaxx  : AR.Real9_Access);
324
325   procedure assign (Stmt  : out Base_Statement;
326                     index : Positive;
327                     vaxx  : AR.Real18_Access);
328
329   procedure assign (Stmt  : out Base_Statement;
330                     index : Positive;
331                     vaxx  : AR.Str1_Access);
332
333   procedure assign (Stmt  : out Base_Statement;
334                     index : Positive;
335                     vaxx  : AR.Str2_Access);
336
337   procedure assign (Stmt  : out Base_Statement;
338                     index : Positive;
339                     vaxx  : AR.Str4_Access);
340
341   procedure assign (Stmt  : out Base_Statement;
342                     index : Positive;
343                     vaxx  : AR.Time_Access);
344
345   procedure assign (Stmt  : out Base_Statement;
346                     index : Positive;
347                     vaxx  : AR.Chain_Access);
348
349   procedure assign (Stmt  : out Base_Statement;
350                     index : Positive;
351                     vaxx  : AR.Enum_Access);
352
353   procedure assign (Stmt  : out Base_Statement;
354                     index : Positive;
355                     vaxx  : AR.Settype_Access);
356
357   procedure assign (Stmt  : out Base_Statement;
358                     index : Positive;
359                     vaxx  : AR.Bits_Access);
360
361   procedure assign (Stmt  : out Base_Statement;
362                     index : Positive;
363                     vaxx  : AR.S_UTF8_Access);
364
365   procedure assign (Stmt  : out Base_Statement;
366                     index : Positive;
367                     vaxx  : AR.Geometry_Access);
368
369
370   ------------------------------------------------
371   --  23 assign/access using moniker for index  --
372   ------------------------------------------------
373   procedure assign (Stmt    : out Base_Statement;
374                     moniker : String;
375                     vaxx    : AR.NByte0_Access);
376
377   procedure assign (Stmt    : out Base_Statement;
378                     moniker : String;
379                     vaxx    : AR.NByte1_Access);
380
381   procedure assign (Stmt    : out Base_Statement;
382                     moniker : String;
383                     vaxx    : AR.NByte2_Access);
384
385   procedure assign (Stmt    : out Base_Statement;
386                     moniker : String;
387                     vaxx    : AR.NByte3_Access);
388
389   procedure assign (Stmt    : out Base_Statement;
390                     moniker : String;
391                     vaxx    : AR.NByte4_Access);
392
393   procedure assign (Stmt    : out Base_Statement;
394                     moniker : String;
395                     vaxx    : AR.NByte8_Access);
396
397   procedure assign (Stmt    : out Base_Statement;
398                     moniker : String;
399                     vaxx    : AR.Byte1_Access);
400
401   procedure assign (Stmt    : out Base_Statement;
402                     moniker : String;
403                     vaxx    : AR.Byte2_Access);
404
405   procedure assign (Stmt    : out Base_Statement;
406                     moniker : String;
407                     vaxx    : AR.Byte3_Access);
408
409   procedure assign (Stmt    : out Base_Statement;
410                     moniker : String;
411                     vaxx    : AR.Byte4_Access);
412
413   procedure assign (Stmt    : out Base_Statement;
414                     moniker : String;
415                     vaxx    : AR.Byte8_Access);
416
417   procedure assign (Stmt    : out Base_Statement;
418                     moniker : String;
419                     vaxx    : AR.Real9_Access);
420
421   procedure assign (Stmt    : out Base_Statement;
422                     moniker : String;
423                     vaxx    : AR.Real18_Access);
424
425   procedure assign (Stmt    : out Base_Statement;
426                     moniker : String;
427                     vaxx    : AR.Str1_Access);
428
429   procedure assign (Stmt    : out Base_Statement;
430                     moniker : String;
431                     vaxx    : AR.Str2_Access);
432
433   procedure assign (Stmt    : out Base_Statement;
434                     moniker : String;
435                     vaxx    : AR.Str4_Access);
436
437   procedure assign (Stmt    : out Base_Statement;
438                     moniker : String;
439                     vaxx    : AR.Time_Access);
440
441   procedure assign (Stmt    : out Base_Statement;
442                     moniker : String;
443                     vaxx    : AR.Chain_Access);
444
445   procedure assign (Stmt    : out Base_Statement;
446                     moniker : String;
447                     vaxx    : AR.Enum_Access);
448
449   procedure assign (Stmt    : out Base_Statement;
450                     moniker : String;
451                     vaxx    : AR.Settype_Access);
452
453   procedure assign (Stmt    : out Base_Statement;
454                     moniker : String;
455                     vaxx    : AR.Bits_Access);
456
457   procedure assign (Stmt    : out Base_Statement;
458                     moniker : String;
459                     vaxx    : AR.S_UTF8_Access);
460
461   procedure assign (Stmt    : out Base_Statement;
462                     moniker : String;
463                     vaxx    : AR.Geometry_Access);
464
465
466   -------------------------------------------
467   --  22 assign/value using integer index  --
468   -------------------------------------------
469   procedure assign (Stmt  : out Base_Statement;
470                     index : Positive;
471                     vaxx  : AR.NByte0);
472
473   procedure assign (Stmt  : out Base_Statement;
474                     index : Positive;
475                     vaxx  : AR.NByte1);
476
477   procedure assign (Stmt  : out Base_Statement;
478                     index : Positive;
479                     vaxx  : AR.NByte2);
480
481   procedure assign (Stmt  : out Base_Statement;
482                     index : Positive;
483                     vaxx  : AR.NByte3);
484
485   procedure assign (Stmt  : out Base_Statement;
486                     index : Positive;
487                     vaxx  : AR.NByte4);
488
489   procedure assign (Stmt  : out Base_Statement;
490                     index : Positive;
491                     vaxx  : AR.NByte8);
492
493   procedure assign (Stmt  : out Base_Statement;
494                     index : Positive;
495                     vaxx  : AR.Byte1);
496
497   procedure assign (Stmt  : out Base_Statement;
498                     index : Positive;
499                     vaxx  : AR.Byte2);
500
501   procedure assign (Stmt  : out Base_Statement;
502                     index : Positive;
503                     vaxx  : AR.Byte3);
504
505   procedure assign (Stmt  : out Base_Statement;
506                     index : Positive;
507                     vaxx  : AR.Byte4);
508
509   procedure assign (Stmt  : out Base_Statement;
510                     index : Positive;
511                     vaxx  : AR.Byte8);
512
513   procedure assign (Stmt  : out Base_Statement;
514                     index : Positive;
515                     vaxx  : AR.Real9);
516
517   procedure assign (Stmt  : out Base_Statement;
518                     index : Positive;
519                     vaxx  : AR.Real18);
520
521   procedure assign (Stmt  : out Base_Statement;
522                     index : Positive;
523                     vaxx  : AR.Textual);
524
525   procedure assign (Stmt  : out Base_Statement;
526                     index : Positive;
527                     vaxx  : AR.Textwide);
528
529   procedure assign (Stmt  : out Base_Statement;
530                     index : Positive;
531                     vaxx  : AR.Textsuper);
532
533   procedure assign (Stmt  : out Base_Statement;
534                     index : Positive;
535                     vaxx  : CAL.Time);
536
537   procedure assign (Stmt  : out Base_Statement;
538                     index : Positive;
539                     vaxx  : AR.Chain);
540
541   procedure assign (Stmt  : out Base_Statement;
542                     index : Positive;
543                     vaxx  : AR.Enumtype);
544
545   procedure assign (Stmt  : out Base_Statement;
546                     index : Positive;
547                     vaxx  : AR.Settype);
548
549   procedure assign (Stmt  : out Base_Statement;
550                     index : Positive;
551                     vaxx  : AR.Bits);
552
553   procedure assign (Stmt  : out Base_Statement;
554                     index : Positive;
555                     vaxx  : AR.Text_UTF8);
556
557   procedure assign (Stmt  : out Base_Statement;
558                     index : Positive;
559                     vaxx  : Spatial_Data.Geometry);
560
561
562   -----------------------------------------------
563   --  23 assign/value using moniker for index  --
564   -----------------------------------------------
565   procedure assign (Stmt    : out Base_Statement;
566                     moniker : String;
567                     vaxx    : AR.NByte0);
568
569   procedure assign (Stmt    : out Base_Statement;
570                     moniker : String;
571                     vaxx    : AR.NByte1);
572
573   procedure assign (Stmt    : out Base_Statement;
574                     moniker : String;
575                     vaxx    : AR.NByte2);
576
577   procedure assign (Stmt    : out Base_Statement;
578                     moniker : String;
579                     vaxx    : AR.NByte3);
580
581   procedure assign (Stmt    : out Base_Statement;
582                     moniker : String;
583                     vaxx    : AR.NByte4);
584
585   procedure assign (Stmt    : out Base_Statement;
586                     moniker : String;
587                     vaxx    : AR.NByte8);
588
589   procedure assign (Stmt    : out Base_Statement;
590                     moniker : String;
591                     vaxx    : AR.Byte1);
592
593   procedure assign (Stmt    : out Base_Statement;
594                     moniker : String;
595                     vaxx    : AR.Byte2);
596
597   procedure assign (Stmt    : out Base_Statement;
598                     moniker : String;
599                     vaxx    : AR.Byte3);
600
601   procedure assign (Stmt    : out Base_Statement;
602                     moniker : String;
603                     vaxx    : AR.Byte4);
604
605   procedure assign (Stmt    : out Base_Statement;
606                     moniker : String;
607                     vaxx    : AR.Byte8);
608
609   procedure assign (Stmt    : out Base_Statement;
610                     moniker : String;
611                     vaxx    : AR.Real9);
612
613   procedure assign (Stmt    : out Base_Statement;
614                     moniker : String;
615                     vaxx    : AR.Real18);
616
617   procedure assign (Stmt    : out Base_Statement;
618                     moniker : String;
619                     vaxx    : AR.Textual);
620
621   procedure assign (Stmt    : out Base_Statement;
622                     moniker : String;
623                     vaxx    : AR.Textwide);
624
625   procedure assign (Stmt    : out Base_Statement;
626                     moniker : String;
627                     vaxx    : AR.Textsuper);
628
629   procedure assign (Stmt    : out Base_Statement;
630                     moniker : String;
631                     vaxx    : CAL.Time);
632
633   procedure assign (Stmt    : out Base_Statement;
634                     moniker : String;
635                     vaxx    : AR.Chain);
636
637   procedure assign (Stmt    : out Base_Statement;
638                     moniker : String;
639                     vaxx    : AR.Enumtype);
640
641   procedure assign (Stmt    : out Base_Statement;
642                     moniker : String;
643                     vaxx    : AR.Settype);
644
645   procedure assign (Stmt    : out Base_Statement;
646                     moniker : String;
647                     vaxx    : AR.Bits);
648
649   procedure assign (Stmt    : out Base_Statement;
650                     moniker : String;
651                     vaxx    : AR.Text_UTF8);
652
653   procedure assign (Stmt    : out Base_Statement;
654                     moniker : String;
655                     vaxx    : Spatial_Data.Geometry);
656
657private
658
659   logger_access : ALF.LogFacility_access;
660
661   function Same_Strings (S, T : String) return Boolean;
662
663   function transform_sql (Stmt : out Base_Statement; sql : String)
664                           return String;
665
666   procedure log_nominal (statement : Base_Statement;
667                          category  : Log_Category;
668                          message   : String);
669
670   procedure free_datarow is new Ada.Unchecked_Deallocation
671     (AR.Sets.Datarow, AR.Sets.Datarow_Access);
672
673   procedure free_sql is new Ada.Unchecked_Deallocation
674     (String, SQL_Access);
675
676   procedure check_bound_column_access (absent : Boolean);
677
678   package Markers is new Ada.Containers.Indefinite_Hashed_Maps
679     (Key_Type        => String,
680      Element_Type    => Positive,
681      Equivalent_Keys => Same_Strings,
682      Hash            => Ada.Strings.Hash);
683
684   function convert is new RGC.convert4str (IntType => AR.NByte1);
685   function convert is new RGC.convert4str (IntType => AR.NByte2);
686   function convert is new RGC.convert4str (IntType => AR.NByte3);
687   function convert is new RGC.convert4str (IntType => AR.NByte4);
688   function convert is new RGC.convert4str (IntType => AR.NByte8);
689   function convert is new RGC.convert4str (IntType => AR.Byte1);
690   function convert is new RGC.convert4str (IntType => AR.Byte2);
691   function convert is new RGC.convert4str (IntType => AR.Byte3);
692   function convert is new RGC.convert4str (IntType => AR.Byte4);
693   function convert is new RGC.convert4str (IntType => AR.Byte8);
694   function convert is new RGC.convert4st2 (RealType => AR.Real9);
695   function convert is new RGC.convert4st2 (RealType => AR.Real18);
696   function convert (nv : String) return AR.Textwide;
697   function convert (nv : String) return AR.Textsuper;
698
699   type bindrec (output_type : field_types := ft_nbyte0)
700   is record
701      bound     : Boolean := False;
702      null_data : Boolean := False;
703      case output_type is
704         when ft_nbyte0    => a00 : AR.NByte0_Access;
705                              v00 : AR.NByte0;
706         when ft_nbyte1    => a01 : AR.NByte1_Access;
707                              v01 : AR.NByte1;
708         when ft_nbyte2    => a02 : AR.NByte2_Access;
709                              v02 : AR.NByte2;
710         when ft_nbyte3    => a03 : AR.NByte3_Access;
711                              v03 : AR.NByte3;
712         when ft_nbyte4    => a04 : AR.NByte4_Access;
713                              v04 : AR.NByte4;
714         when ft_nbyte8    => a05 : AR.NByte8_Access;
715                              v05 : AR.NByte8;
716         when ft_byte1     => a06 : AR.Byte1_Access;
717                              v06 : AR.Byte1;
718         when ft_byte2     => a07 : AR.Byte2_Access;
719                              v07 : AR.Byte2;
720         when ft_byte3     => a08 : AR.Byte3_Access;
721                              v08 : AR.Byte3;
722         when ft_byte4     => a09 : AR.Byte4_Access;
723                              v09 : AR.Byte4;
724         when ft_byte8     => a10 : AR.Byte8_Access;
725                              v10 : AR.Byte8;
726         when ft_real9     => a11 : AR.Real9_Access;
727                              v11 : AR.Real9;
728         when ft_real18    => a12 : AR.Real18_Access;
729                              v12 : AR.Real18;
730         when ft_textual   => a13 : AR.Str1_Access;
731                              v13 : AR.Textual;
732         when ft_widetext  => a14 : AR.Str2_Access;
733                              v14 : AR.Textwide;
734         when ft_supertext => a15 : AR.Str4_Access;
735                              v15 : AR.Textsuper;
736         when ft_timestamp => a16 : AR.Time_Access;
737                              v16 : CAL.Time;
738         when ft_chain     => a17 : AR.Chain_Access;
739                              v17 : AR.Textual;
740         when ft_enumtype  => a18 : AR.Enum_Access;
741                              v18 : AR.Enumtype;
742         when ft_settype   => a19 : AR.Settype_Access;
743                              v19 : AR.Textual;
744         when ft_bits      => a20 : AR.Bits_Access;
745                              v20 : AR.Textual;
746         when ft_utf8      => a21 : AR.S_UTF8_Access;
747                              v21 : AR.Textual;
748         when ft_geometry  => a22 : AR.Geometry_Access;
749                              v22 : AR.Textual;
750      end case;
751   end record;
752
753   procedure set_as_null (param : bindrec);
754
755
756   --  For fetch_bound
757   function bind_proceed (Stmt : Base_Statement; index : Positive)
758                          return Boolean;
759
760   function bind_index (Stmt : Base_Statement; heading : String)
761                        return Positive;
762
763   function assign_index (Stmt : Base_Statement; moniker : String)
764                          return Positive;
765
766   procedure auto_assign (Stmt  : out Base_Statement; index : Positive;
767                          value : String);
768
769   package bind_crate is new Ada.Containers.Vectors
770     (Index_Type   => Positive,
771      Element_Type => bindrec);
772
773   type Base_Statement is
774     abstract new Base_Pure and AIS.iStatement with record
775      successful_execution : Boolean       := False;
776      result_present       : Boolean       := False;
777      rows_leftover        : Boolean       := False;
778      dialect              : Driver_Type   := foundation;
779      impacted             : Affected_Rows := 0;
780      connection           : ACB.Base_Connection_Access;
781      alpha_markers        : Markers.Map;
782      headings_map         : Markers.Map;
783      crate                : bind_crate.Vector;
784      realmccoy            : bind_crate.Vector;
785   end record;
786
787end AdaBase.Statement.Base;
788