| 1 | /***********************************************************************/ |
| 2 | /* GLOBAL.H: Declaration file used by all CONNECT implementations. */ |
| 3 | /* (C) Copyright MariaDB Corporation Ab */ |
| 4 | /* Author Olivier Bertrand 1993-2017 */ |
| 5 | /***********************************************************************/ |
| 6 | |
| 7 | /***********************************************************************/ |
| 8 | /* Included C-definition files common to all Plug routines */ |
| 9 | /***********************************************************************/ |
| 10 | #include <string.h> /* String manipulation declares */ |
| 11 | #include <stdlib.h> /* C standard library */ |
| 12 | #include <ctype.h> /* C language specific types */ |
| 13 | #include <stdio.h> /* FOPEN_MAX declaration */ |
| 14 | #include <time.h> /* time_t type declaration */ |
| 15 | #include <setjmp.h> /* Long jump declarations */ |
| 16 | |
| 17 | #if defined(__WIN__) && !defined(NOEX) |
| 18 | #define DllExport __declspec( dllexport ) |
| 19 | #else // !__WIN__ |
| 20 | #define DllExport |
| 21 | #endif // !__WIN__ |
| 22 | |
| 23 | #if defined(DOMDOC_SUPPORT) || defined(LIBXML2_SUPPORT) |
| 24 | #define XML_SUPPORT 1 |
| 25 | #endif |
| 26 | |
| 27 | #if defined(XMSG) |
| 28 | //#error Option XMSG is not yet fully implemented |
| 29 | // Definition used to read messages from message file. |
| 30 | #include "msgid.h" |
| 31 | #define MSG(I) PlugReadMessage(NULL, MSG_##I, #I) |
| 32 | #define STEP(I) PlugReadMessage(g, MSG_##I, #I) |
| 33 | #elif defined(NEWMSG) |
| 34 | //#error Option NEWMSG is not yet fully implemented |
| 35 | // Definition used to get messages from resource. |
| 36 | #include "msgid.h" |
| 37 | #define MSG(I) PlugGetMessage(NULL, MSG_##I) |
| 38 | #define STEP(I) PlugGetMessage(g, MSG_##I) |
| 39 | #else // !XMSG and !NEWMSG |
| 40 | // Definition used to replace messages ID's by their definition. |
| 41 | #include "messages.h" |
| 42 | #define MSG(I) MSG_##I |
| 43 | #define STEP(I) MSG_##I |
| 44 | #endif // !XMSG and !NEWMSG |
| 45 | |
| 46 | #if defined(__WIN__) |
| 47 | #define CRLF 2 |
| 48 | #else // !__WIN__ |
| 49 | #define CRLF 1 |
| 50 | #endif // !__WIN__ |
| 51 | |
| 52 | /***********************************************************************/ |
| 53 | /* Define access to the thread based trace value. */ |
| 54 | /***********************************************************************/ |
| 55 | #define trace(T) (bool)(GetTraceValue() & (uint)T) |
| 56 | |
| 57 | /***********************************************************************/ |
| 58 | /* Miscellaneous Constants */ |
| 59 | /***********************************************************************/ |
| 60 | #define NO_IVAL -95684275 /* Used by GetIntegerOption */ |
| 61 | #define MAX_JUMP 24 /* Maximum jump level number */ |
| 62 | #define MAX_STR 4160 /* Maximum message length */ |
| 63 | |
| 64 | #define TYPE_VOID -1 |
| 65 | #define TYPE_ERROR 0 |
| 66 | #define TYPE_STRING 1 |
| 67 | #define TYPE_DOUBLE 2 |
| 68 | #define TYPE_SHORT 3 |
| 69 | #define TYPE_TINY 4 |
| 70 | #define TYPE_BIGINT 5 |
| 71 | #define TYPE_LIST 6 |
| 72 | #define TYPE_INT 7 |
| 73 | #define TYPE_DATE 8 |
| 74 | #define TYPE_DECIM 9 |
| 75 | #define TYPE_BIN 10 |
| 76 | #define TYPE_PCHAR 11 |
| 77 | |
| 78 | #if defined(__cplusplus) |
| 79 | extern "C" { |
| 80 | #endif |
| 81 | |
| 82 | /***********************************************************************/ |
| 83 | /* Static variables */ |
| 84 | /***********************************************************************/ |
| 85 | |
| 86 | /***********************************************************************/ |
| 87 | /* File-Selection Indicators */ |
| 88 | /***********************************************************************/ |
| 89 | #define PAT_LOG "log" |
| 90 | |
| 91 | #if defined(UNIX) || defined(LINUX) || defined(UNIV_LINUX) |
| 92 | /*********************************************************************/ |
| 93 | /* printf does not accept null pointer for %s target. */ |
| 94 | /*********************************************************************/ |
| 95 | #define SVP(S) ((S) ? S : "<null>") |
| 96 | #else |
| 97 | /*********************************************************************/ |
| 98 | /* printf accepts null pointer for %s target. */ |
| 99 | /*********************************************************************/ |
| 100 | #define SVP(S) S |
| 101 | #endif |
| 102 | |
| 103 | #if defined(STORAGE) |
| 104 | FILE *debug; |
| 105 | #else |
| 106 | extern FILE *debug; |
| 107 | #endif |
| 108 | |
| 109 | |
| 110 | /***********************************************************************/ |
| 111 | /* General purpose type definitions. */ |
| 112 | /***********************************************************************/ |
| 113 | #include "os.h" |
| 114 | |
| 115 | typedef uint OFFSET; |
| 116 | typedef char NAME[9]; |
| 117 | |
| 118 | typedef struct { |
| 119 | ushort Length; |
| 120 | char String[2]; |
| 121 | } VARSTR; |
| 122 | |
| 123 | #if !defined(PGLOBAL_DEFINED) |
| 124 | typedef struct _global *PGLOBAL; |
| 125 | #define PGLOBAL_DEFINED |
| 126 | #endif |
| 127 | typedef struct _globplg *PGS; |
| 128 | typedef struct _activity *PACTIVITY; |
| 129 | typedef struct _parm *PPARM; |
| 130 | |
| 131 | /***********************************************************************/ |
| 132 | /* Segment Sub-Allocation block structure declares. */ |
| 133 | /* Next block is an implementation dependent segment suballoc save */ |
| 134 | /* structure used to keep the suballocation system offsets and to */ |
| 135 | /* restore them if needed. This scheme implies that no SubFree be used */ |
| 136 | /***********************************************************************/ |
| 137 | typedef struct { /* Plug Area SubAlloc header */ |
| 138 | OFFSET To_Free; /* Offset of next free block */ |
| 139 | uint FreeBlk; /* Size of remaining free memory */ |
| 140 | } , *; |
| 141 | |
| 142 | /***********************************************************************/ |
| 143 | /* Language block. Containing all global information for the language */ |
| 144 | /* this block is saved and retrieved with the language. Information */ |
| 145 | /* in this block can be set and modified under Grammar editing. */ |
| 146 | /***********************************************************************/ |
| 147 | #if defined(BIT64) |
| 148 | typedef int TIME_T; /* Lang block size must not change */ |
| 149 | #else // BIT32 |
| 150 | typedef time_t TIME_T; /* time_t */ |
| 151 | #endif // BIT32 |
| 152 | |
| 153 | typedef struct { |
| 154 | uint Memsize; |
| 155 | uint Size; |
| 156 | } AREADEF; |
| 157 | |
| 158 | typedef struct Lang_block { |
| 159 | NAME LangName; /* Language name */ |
| 160 | NAME Application; /* Application name */ |
| 161 | } LANG, *PLANG; |
| 162 | |
| 163 | /***********************************************************************/ |
| 164 | /* Application block. It contains all global information for the */ |
| 165 | /* current parse and execution using the corresponding language. */ |
| 166 | /* This block is dynamically allocated and set at language init. */ |
| 167 | /***********************************************************************/ |
| 168 | typedef struct _activity { /* Describes activity and language */ |
| 169 | void *Aptr; /* Points to user work area(s) */ |
| 170 | NAME Ap_Name; /* Current application name */ |
| 171 | } ACTIVITY; |
| 172 | |
| 173 | /*---------------- UNIT ?????????? VERSION ? ----------------------*/ |
| 174 | typedef struct _parm { |
| 175 | union { |
| 176 | void *Value; |
| 177 | int Intval; |
| 178 | }; // end union |
| 179 | short Type, Domain; |
| 180 | PPARM Next; |
| 181 | } PARM; |
| 182 | |
| 183 | /***********************************************************************/ |
| 184 | /* Global Structure Block. This block contains, or points to, all */ |
| 185 | /* information used by CONNECT tables. Passed as an argument */ |
| 186 | /* to any routine allows it to have access to the entire information */ |
| 187 | /* currently available for the whole set of loaded languages. */ |
| 188 | /***********************************************************************/ |
| 189 | typedef struct _global { /* Global structure */ |
| 190 | void *Sarea; /* Points to work area */ |
| 191 | uint Sarea_Size; /* Work area size */ |
| 192 | PACTIVITY Activityp; |
| 193 | char Message[MAX_STR]; |
| 194 | ulong More; /* Used by jsonudf */ |
| 195 | int Createas; /* To pass info to created table */ |
| 196 | void *Xchk; /* indexes in create/alter */ |
| 197 | short Alchecked; /* Checked for ALTER */ |
| 198 | short Mrr; /* True when doing mrr */ |
| 199 | int N; /* Utility */ |
| 200 | int jump_level; |
| 201 | jmp_buf jumper[MAX_JUMP + 2]; |
| 202 | } GLOBAL; |
| 203 | |
| 204 | /***********************************************************************/ |
| 205 | /* Exported routine declarations. */ |
| 206 | /***********************************************************************/ |
| 207 | #if defined(XMSG) |
| 208 | DllExport char *PlugReadMessage(PGLOBAL, int, char *); |
| 209 | #elif defined(NEWMSG) |
| 210 | DllExport char *PlugGetMessage(PGLOBAL, int); |
| 211 | #endif // XMSG || NEWMSG |
| 212 | #if defined(__WIN__) |
| 213 | DllExport short GetLineLength(PGLOBAL); // Console line length |
| 214 | #endif // __WIN__ |
| 215 | DllExport PGLOBAL PlugInit(LPCSTR, uint); // Plug global initialization |
| 216 | DllExport int PlugExit(PGLOBAL); // Plug global termination |
| 217 | DllExport LPSTR PlugRemoveType(LPSTR, LPCSTR); |
| 218 | DllExport LPCSTR PlugSetPath(LPSTR to, LPCSTR prefix, LPCSTR name, LPCSTR dir); |
| 219 | DllExport BOOL PlugIsAbsolutePath(LPCSTR path); |
| 220 | DllExport bool AllocSarea(PGLOBAL, uint); |
| 221 | DllExport void FreeSarea(PGLOBAL); |
| 222 | DllExport BOOL PlugSubSet(PGLOBAL, void *, uint); |
| 223 | DllExport char *PlugDup(PGLOBAL g, const char *str); |
| 224 | DllExport void *MakePtr(void *, OFFSET); |
| 225 | DllExport void htrc(char const *fmt, ...); |
| 226 | //DllExport int GetTraceValue(void); |
| 227 | DllExport uint GetTraceValue(void); |
| 228 | |
| 229 | #if defined(__cplusplus) |
| 230 | } // extern "C" |
| 231 | #endif |
| 232 | |
| 233 | /***********************************************************************/ |
| 234 | /* Non exported routine declarations. */ |
| 235 | /***********************************************************************/ |
| 236 | void *PlugSubAlloc(PGLOBAL, void *, size_t); // Does throw |
| 237 | |
| 238 | /*-------------------------- End of Global.H --------------------------*/ |
| 239 | |