1 /************************************************************************************
2    Copyright (C) 2013, 2019 MariaDB Corporation AB
3 
4    This library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Library General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    This library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Library General Public License for more details.
13 
14    You should have received a copy of the GNU Library General Public
15    License along with this library; if not see <http://www.gnu.org/licenses>
16    or write to the Free Software Foundation, Inc.,
17    51 Franklin St., Fifth Floor, Boston, MA 02110, USA
18 *************************************************************************************/
19 #ifndef _ma_statement_h_
20 #define _ma_statement_h_
21 
22 #include "ma_catalog.h"
23 
24 #define MADB_FETCH_TYPE_FETCH       1
25 #define MADB_FETCH_TYPE_BULK        2
26 #define MADB_FETCH_TYPE_SETPOS      3
27 
28 
29 struct st_ma_stmt_methods
30 {
31   SQLRETURN (*Prepare)(MADB_Stmt *Stmt, char *StatementText, SQLINTEGER TextLength, BOOL ExecDirect);
32   SQLRETURN (*Execute)(MADB_Stmt *Stmt, BOOL ExecDirect);
33   SQLRETURN (*Fetch)(MADB_Stmt *Stmt);
34   SQLRETURN (*BindColumn)(MADB_Stmt *Stmt, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType,
35                      SQLPOINTER TargetValuePtr, SQLLEN BufferLength, SQLLEN *StrLen_or_Ind);
36   SQLRETURN (*BindParam)(MADB_Stmt *Stmt,  SQLUSMALLINT ParameterNumber, SQLSMALLINT InputOutputType, SQLSMALLINT ValueType,
37                         SQLSMALLINT ParameterType, SQLULEN ColumnSize, SQLSMALLINT DecimalDigits, SQLPOINTER ParameterValuePtr,
38                         SQLLEN BufferLength, SQLLEN *StrLen_or_IndPtr);
39   SQLRETURN (*ExecDirect)(MADB_Stmt *Stmt, char *StatementText, SQLINTEGER TextLength);
40   SQLRETURN (*GetData)(SQLHSTMT StatementHandle, SQLUSMALLINT Col_or_Param_Num, SQLSMALLINT TargetType,
41                        SQLPOINTER TargetValuePtr, SQLLEN BufferLength, SQLLEN * StrLen_or_IndPtr, BOOL InternalUse);
42   SQLRETURN (*RowCount)(MADB_Stmt *Stmt, SQLLEN *RowCountPtr);
43   SQLRETURN (*ParamCount)(MADB_Stmt *Stmt, SQLSMALLINT *ParamCountPtr);
44   SQLRETURN (*ColumnCount)(MADB_Stmt *Stmt, SQLSMALLINT *ColumnCountPtr);
45   SQLRETURN (*GetAttr)(MADB_Stmt *Stmt, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER BufferLength,
46                        SQLINTEGER *StringLength);
47   SQLRETURN (*SetAttr)(MADB_Stmt *Stmt, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);
48   SQLRETURN (*StmtFree)(MADB_Stmt *Stmt, SQLUSMALLINT Option);
49   SQLRETURN (*ColAttribute)(MADB_Stmt *Stmt, SQLUSMALLINT ColumnNumber, SQLUSMALLINT FieldIdentifier, SQLPOINTER CharacterAttributePtr,
50              SQLSMALLINT BufferLength, SQLSMALLINT *StringLengthPtr, SQLLEN *NumericAttributePtr,
51              my_bool isWchar);
52   SQLRETURN (*ColumnPrivileges)(MADB_Stmt *Stmt, char *CatalogName, SQLSMALLINT NameLength1,
53                                 char *SchemaName, SQLSMALLINT NameLength2, char *TableName,
54                                 SQLSMALLINT NameLength3, char *ColumnName, SQLSMALLINT NameLength4);
55   SQLRETURN (*TablePrivileges)(MADB_Stmt *Stmt, char *CatalogName, SQLSMALLINT NameLength1,
56                                char *SchemaName, SQLSMALLINT NameLength2,
57                                char *TableName, SQLSMALLINT NameLength3);
58   SQLRETURN (*Tables)(MADB_Stmt *Stmt, char *CatalogName, SQLSMALLINT NameLength1,
59                       char *SchemaName, SQLSMALLINT NameLength2, char *TableName,
60                       SQLSMALLINT NameLength3, char *TableType, SQLSMALLINT NameLength4);
61   SQLRETURN (*Statistics)(MADB_Stmt *Stmt, char *CatalogName, SQLSMALLINT NameLength1,
62                           char *SchemaName, SQLSMALLINT NameLength2,
63                           char *TableName, SQLSMALLINT NameLength3,
64                           SQLUSMALLINT Unique, SQLUSMALLINT Reserved);
65   SQLRETURN (*Columns)(MADB_Stmt *Stmt, char *CatalogName, SQLSMALLINT NameLength1,
66                        char *SchemaName, SQLSMALLINT NameLength2,
67                        char *TableName, SQLSMALLINT NameLength3,
68                        char *ColumnName, SQLSMALLINT NameLength4);
69   SQLRETURN (*ProcedureColumns)(MADB_Stmt *Stmt, char *CatalogName, SQLSMALLINT NameLength1,
70                                 char *SchemaName, SQLSMALLINT NameLength2, char *ProcName,
71                                 SQLSMALLINT NameLength3, char *ColumnName, SQLSMALLINT NameLength4);
72   SQLRETURN (*PrimaryKeys)(MADB_Stmt *Stmt, char *CatalogName, SQLSMALLINT NameLength1,
73                                char *SchemaName, SQLSMALLINT NameLength2, char *TableName,
74                                SQLSMALLINT NameLength3);
75   SQLRETURN (*SpecialColumns)(MADB_Stmt *Stmt, SQLUSMALLINT IdentifierType,
76                               char *CatalogName, SQLSMALLINT NameLength1,
77                               char *SchemaName, SQLSMALLINT NameLength2,
78                               char *TableName, SQLSMALLINT NameLength3,
79                               SQLUSMALLINT Scope, SQLUSMALLINT Nullable);
80   SQLRETURN (*Procedures)(MADB_Stmt *Stmt, char *CatalogName, SQLSMALLINT NameLength1,
81                           char *SchemaName, SQLSMALLINT NameLength2, char *ProcName,
82                           SQLSMALLINT NameLength3);
83   SQLRETURN (*ForeignKeys)(MADB_Stmt *Stmt, char *PKCatalogName, SQLSMALLINT NameLength1,
84                            char *PKSchemaName, SQLSMALLINT NameLength2, char *PKTableName,
85                            SQLSMALLINT NameLength3, char *FKCatalogName, SQLSMALLINT NameLength4,
86                            char *FKSchemaName, SQLSMALLINT NameLength5,  char *FKTableName,
87                            SQLSMALLINT NameLength6);
88   SQLRETURN (*DescribeCol)(MADB_Stmt *Stmt, SQLUSMALLINT ColumnNumber, void *ColumnName,
89                          SQLSMALLINT BufferLength, SQLSMALLINT *NameLengthPtr,
90                          SQLSMALLINT *DataTypePtr, SQLULEN *ColumnSizePtr, SQLSMALLINT *DecimalDigitsPtr,
91                          SQLSMALLINT *NullablePtr, my_bool isWChar);
92   SQLRETURN (*SetCursorName)(MADB_Stmt *Stmt, char *Buffer, SQLINTEGER BufferLength);
93   SQLRETURN (*GetCursorName)(MADB_Stmt *Stmt, void *CursorName, SQLSMALLINT BufferLength,
94                              SQLSMALLINT *NameLengthPtr, my_bool isWChar);
95   SQLRETURN (*SetPos)(MADB_Stmt *Stmt, SQLSETPOSIROW Row, SQLUSMALLINT Operation,
96                       SQLUSMALLINT LockType, int ArrayOffset);
97   SQLRETURN (*FetchScroll)(MADB_Stmt *Stmt, SQLSMALLINT FetchOrientation,
98                            SQLLEN FetchOffset);
99   SQLRETURN (*ParamData)(MADB_Stmt *Stmt, SQLPOINTER *ValuePtrPtr);
100   SQLRETURN (*PutData)(MADB_Stmt *Stmt, SQLPOINTER DataPtr, SQLLEN StrLen_or_Ind);
101   SQLRETURN (*BulkOperations)(MADB_Stmt *Stmt, SQLSMALLINT Operation);
102   SQLRETURN (*RefreshDynamicCursor)(MADB_Stmt *Stmt);
103   SQLRETURN (*RefreshRowPtrs)(MADB_Stmt *Stmt);
104   SQLRETURN (*GetOutParams)(MADB_Stmt *Stmt, int CurrentOffset);
105 };
106 
107 SQLRETURN    MADB_StmtInit          (MADB_Dbc *Connection, SQLHANDLE *pHStmt);
108 SQLUSMALLINT MapColAttributeDescType(SQLUSMALLINT FieldIdentifier);
109 MYSQL_RES*   FetchMetadata          (MADB_Stmt *Stmt);
110 SQLRETURN    MADB_DoExecute(MADB_Stmt *Stmt, BOOL ExecDirect);
111 
112 #define MADB_MAX_CURSOR_NAME 64 * 4 + 1
113 #define MADB_CHECK_STMT_HANDLE(a,b)\
114   if (!(a) || !(a)->b)\
115     return SQL_INVALID_HANDLE
116 
117 #define MADB_STMT_COLUMN_COUNT(aStmt) (aStmt)->Ird->Header.Count
118 #define MADB_RESET_COLUMT_COUNT(aStmt) (aStmt)->Ird->Header.Count= 0
119 #define MADB_STMT_PARAM_COUNT(aStmt)  (aStmt)->ParamCount
120 #define MADB_POSITIONED_COMMAND(aStmt) ((aStmt)->PositionedCommand && (aStmt)->PositionedCursor)
121 /* So far we always use all fields for index. Once that is changed, this should be changed as well */
122 #define MADB_POS_COMM_IDX_FIELD_COUNT(aStmt) MADB_STMT_COLUMN_COUNT((aStmt)->PositionedCursor)
123 #define MADB_STMT_FORGET_NEXT_POS(aStmt) (aStmt)->Cursor.Next= NULL
124 #define MADB_STMT_RESET_CURSOR(aStmt) (aStmt)->Cursor.Position= -1; MADB_STMT_FORGET_NEXT_POS(aStmt)
125 #define MADB_STMT_CLOSE_STMT(aStmt)   mysql_stmt_close((aStmt)->stmt);(aStmt)->stmt= NULL
126 
127 #endif
128