| 1 | /************** MyUtil C++ Program Source Code File (.CPP) **************/ |
| 2 | /* PROGRAM NAME: MYUTIL */ |
| 3 | /* ------------- */ |
| 4 | /* Version 1.2 */ |
| 5 | /* */ |
| 6 | /* Author Olivier BERTRAND 2014 */ |
| 7 | /* */ |
| 8 | /* WHAT THIS PROGRAM DOES: */ |
| 9 | /* ----------------------- */ |
| 10 | /* It contains utility functions to convert data types. */ |
| 11 | /* It can optionally use the embedded MySQL library. */ |
| 12 | /* */ |
| 13 | /************************************************************************/ |
| 14 | #include "my_global.h" |
| 15 | #include <mysql.h> |
| 16 | #if defined(__WIN__) |
| 17 | //#include <windows.h> |
| 18 | #else // !__WIN__ |
| 19 | #include "osutil.h" |
| 20 | #endif // !__WIN__ |
| 21 | |
| 22 | #include "global.h" |
| 23 | #include "plgdbsem.h" |
| 24 | //#include "value.h" |
| 25 | //#include "valblk.h" |
| 26 | #include "myutil.h" |
| 27 | #define DLL_EXPORT // Items are exported from this DLL |
| 28 | |
| 29 | //extern "C" int xconv; |
| 30 | TYPCONV GetTypeConv(void); |
| 31 | |
| 32 | /************************************************************************/ |
| 33 | /* Convert from MySQL type name to PlugDB type number */ |
| 34 | /************************************************************************/ |
| 35 | int MYSQLtoPLG(char *typname, char *var) |
| 36 | { |
| 37 | int type; |
| 38 | TYPCONV xconv = GetTypeConv(); |
| 39 | |
| 40 | if (!stricmp(typname, "int" ) || !stricmp(typname, "mediumint" ) || |
| 41 | !stricmp(typname, "integer" )) |
| 42 | type = TYPE_INT; |
| 43 | else if (!stricmp(typname, "smallint" )) |
| 44 | type = TYPE_SHORT; |
| 45 | else if (!stricmp(typname, "char" ) || !stricmp(typname, "varchar" ) || |
| 46 | !stricmp(typname, "enum" ) || !stricmp(typname, "set" )) |
| 47 | type = TYPE_STRING; |
| 48 | else if (!stricmp(typname, "double" ) || !stricmp(typname, "float" ) || |
| 49 | !stricmp(typname, "real" )) |
| 50 | type = TYPE_DOUBLE; |
| 51 | else if (!stricmp(typname, "decimal" ) || !stricmp(typname, "numeric" )) |
| 52 | type = TYPE_DECIM; |
| 53 | else if (!stricmp(typname, "date" ) || !stricmp(typname, "datetime" ) || |
| 54 | !stricmp(typname, "time" ) || !stricmp(typname, "timestamp" ) || |
| 55 | !stricmp(typname, "year" )) |
| 56 | type = TYPE_DATE; |
| 57 | else if (!stricmp(typname, "bigint" ) || !stricmp(typname, "longlong" )) |
| 58 | type = TYPE_BIGINT; |
| 59 | else if (!stricmp(typname, "tinyint" )) |
| 60 | type = TYPE_TINY; |
| 61 | else if (!stricmp(typname, "text" ) && var) { |
| 62 | switch (xconv) { |
| 63 | case TPC_YES: |
| 64 | type = TYPE_STRING; |
| 65 | *var = 'X'; |
| 66 | break; |
| 67 | case TPC_SKIP: |
| 68 | *var = 'K'; |
| 69 | default: // TPC_NO |
| 70 | type = TYPE_ERROR; |
| 71 | } // endswitch xconv |
| 72 | |
| 73 | return type; |
| 74 | } else |
| 75 | type = TYPE_ERROR; |
| 76 | |
| 77 | if (var) { |
| 78 | if (type == TYPE_DATE) { |
| 79 | // This is to make the difference between temporal values |
| 80 | if (!stricmp(typname, "date" )) |
| 81 | *var = 'D'; |
| 82 | else if (!stricmp(typname, "datetime" )) |
| 83 | *var = 'A'; |
| 84 | else if (!stricmp(typname, "timestamp" )) |
| 85 | *var = 'S'; |
| 86 | else if (!stricmp(typname, "time" )) |
| 87 | *var = 'T'; |
| 88 | else if (!stricmp(typname, "year" )) |
| 89 | *var = 'Y'; |
| 90 | |
| 91 | } else if (type == TYPE_STRING) { |
| 92 | if (!stricmp(typname, "varchar" )) |
| 93 | // This is to make the difference between CHAR and VARCHAR |
| 94 | *var = 'V'; |
| 95 | |
| 96 | } else if (type == TYPE_ERROR && xconv == TPC_SKIP) |
| 97 | *var = 'K'; |
| 98 | else |
| 99 | *var = 0; |
| 100 | |
| 101 | } // endif var |
| 102 | |
| 103 | return type; |
| 104 | } // end of MYSQLtoPLG |
| 105 | |
| 106 | /************************************************************************/ |
| 107 | /* Convert from PlugDB type to MySQL type number */ |
| 108 | /************************************************************************/ |
| 109 | enum enum_field_types PLGtoMYSQL(int type, bool dbf, char v) |
| 110 | { |
| 111 | enum enum_field_types mytype; |
| 112 | |
| 113 | switch (type) { |
| 114 | case TYPE_INT: |
| 115 | mytype = MYSQL_TYPE_LONG; |
| 116 | break; |
| 117 | case TYPE_SHORT: |
| 118 | mytype = MYSQL_TYPE_SHORT; |
| 119 | break; |
| 120 | case TYPE_DOUBLE: |
| 121 | mytype = MYSQL_TYPE_DOUBLE; |
| 122 | break; |
| 123 | case TYPE_DATE: |
| 124 | mytype = (dbf) ? MYSQL_TYPE_DATE : |
| 125 | (v == 'S') ? MYSQL_TYPE_TIMESTAMP : |
| 126 | (v == 'D') ? MYSQL_TYPE_NEWDATE : |
| 127 | (v == 'T') ? MYSQL_TYPE_TIME : |
| 128 | (v == 'Y') ? MYSQL_TYPE_YEAR : MYSQL_TYPE_DATETIME; |
| 129 | break; |
| 130 | case TYPE_STRING: |
| 131 | mytype = (v) ? MYSQL_TYPE_VARCHAR : MYSQL_TYPE_STRING; |
| 132 | break; |
| 133 | case TYPE_BIGINT: |
| 134 | mytype = MYSQL_TYPE_LONGLONG; |
| 135 | break; |
| 136 | case TYPE_TINY: |
| 137 | mytype = MYSQL_TYPE_TINY; |
| 138 | break; |
| 139 | case TYPE_DECIM: |
| 140 | #if !defined(ALPHA) |
| 141 | mytype = MYSQL_TYPE_NEWDECIMAL; |
| 142 | #else // ALPHA |
| 143 | mytype = MYSQL_TYPE_DECIMAL; |
| 144 | #endif // ALPHA |
| 145 | break; |
| 146 | default: |
| 147 | mytype = MYSQL_TYPE_NULL; |
| 148 | } // endswitch mytype |
| 149 | |
| 150 | return mytype; |
| 151 | } // end of PLGtoMYSQL |
| 152 | |
| 153 | /************************************************************************/ |
| 154 | /* Convert from PlugDB type to MySQL type name */ |
| 155 | /************************************************************************/ |
| 156 | const char *PLGtoMYSQLtype(int type, bool dbf, char v) |
| 157 | { |
| 158 | switch (type) { |
| 159 | case TYPE_INT: return "INT" ; |
| 160 | case TYPE_SHORT: return "SMALLINT" ; |
| 161 | case TYPE_DOUBLE: return "DOUBLE" ; |
| 162 | case TYPE_DATE: return dbf ? "DATE" : |
| 163 | (v == 'S') ? "TIMESTAMP" : |
| 164 | (v == 'D') ? "DATE" : |
| 165 | (v == 'T') ? "TIME" : |
| 166 | (v == 'Y') ? "YEAR" : "DATETIME" ; |
| 167 | case TYPE_STRING: return v ? "VARCHAR" : "CHAR" ; |
| 168 | case TYPE_BIGINT: return "BIGINT" ; |
| 169 | case TYPE_TINY: return "TINYINT" ; |
| 170 | case TYPE_DECIM: return "DECIMAL" ; |
| 171 | default: return "CHAR(0)" ; |
| 172 | } // endswitch mytype |
| 173 | |
| 174 | return "CHAR(0)" ; |
| 175 | } // end of PLGtoMYSQLtype |
| 176 | |
| 177 | /************************************************************************/ |
| 178 | /* Convert from MySQL type to PlugDB type number */ |
| 179 | /************************************************************************/ |
| 180 | int MYSQLtoPLG(int mytype, char *var) |
| 181 | { |
| 182 | int type, xconv = GetTypeConv(); |
| 183 | |
| 184 | switch (mytype) { |
| 185 | case MYSQL_TYPE_SHORT: |
| 186 | type = TYPE_SHORT; |
| 187 | break; |
| 188 | case MYSQL_TYPE_LONG: |
| 189 | case MYSQL_TYPE_INT24: |
| 190 | case MYSQL_TYPE_ENUM: // ??? |
| 191 | type = TYPE_INT; |
| 192 | break; |
| 193 | case MYSQL_TYPE_LONGLONG: |
| 194 | type = TYPE_BIGINT; |
| 195 | break; |
| 196 | case MYSQL_TYPE_TINY: |
| 197 | type = TYPE_TINY; |
| 198 | break; |
| 199 | case MYSQL_TYPE_DECIMAL: |
| 200 | #if !defined(ALPHA) |
| 201 | case MYSQL_TYPE_NEWDECIMAL: |
| 202 | #endif // !ALPHA) |
| 203 | type = TYPE_DECIM; |
| 204 | break; |
| 205 | case MYSQL_TYPE_FLOAT: |
| 206 | case MYSQL_TYPE_DOUBLE: |
| 207 | type = TYPE_DOUBLE; |
| 208 | break; |
| 209 | case MYSQL_TYPE_TIMESTAMP: |
| 210 | case MYSQL_TYPE_DATE: |
| 211 | case MYSQL_TYPE_DATETIME: |
| 212 | case MYSQL_TYPE_YEAR: |
| 213 | case MYSQL_TYPE_TIME: |
| 214 | type = TYPE_DATE; |
| 215 | break; |
| 216 | case MYSQL_TYPE_VAR_STRING: |
| 217 | #if !defined(ALPHA) |
| 218 | case MYSQL_TYPE_VARCHAR: |
| 219 | #endif // !ALPHA) |
| 220 | case MYSQL_TYPE_STRING: |
| 221 | type = (*var == 'B') ? TYPE_BIN : TYPE_STRING; |
| 222 | break; |
| 223 | case MYSQL_TYPE_BLOB: |
| 224 | case MYSQL_TYPE_TINY_BLOB: |
| 225 | case MYSQL_TYPE_MEDIUM_BLOB: |
| 226 | case MYSQL_TYPE_LONG_BLOB: |
| 227 | if (var) { |
| 228 | switch (xconv) { |
| 229 | case TPC_YES: |
| 230 | if (*var != 'B') { |
| 231 | // This is a TEXT column |
| 232 | type = TYPE_STRING; |
| 233 | *var = 'X'; |
| 234 | } else |
| 235 | type = TYPE_BIN; |
| 236 | |
| 237 | break; |
| 238 | case TPC_SKIP: |
| 239 | *var = 'K'; // Skip |
| 240 | default: // TPC_NO |
| 241 | type = TYPE_ERROR; |
| 242 | } // endswitch xconv |
| 243 | |
| 244 | return type; |
| 245 | } // endif var |
| 246 | |
| 247 | default: |
| 248 | type = TYPE_ERROR; |
| 249 | } // endswitch mytype |
| 250 | |
| 251 | if (var) switch (mytype) { |
| 252 | // This is to make the difference between CHAR and VARCHAR |
| 253 | #if !defined(ALPHA) |
| 254 | case MYSQL_TYPE_VARCHAR: |
| 255 | #endif // !ALPHA) |
| 256 | case MYSQL_TYPE_VAR_STRING: *var = 'V'; break; |
| 257 | // This is to make the difference between temporal values |
| 258 | case MYSQL_TYPE_TIMESTAMP: *var = 'S'; break; |
| 259 | case MYSQL_TYPE_DATE: *var = 'D'; break; |
| 260 | case MYSQL_TYPE_DATETIME: *var = 'A'; break; |
| 261 | case MYSQL_TYPE_YEAR: *var = 'Y'; break; |
| 262 | case MYSQL_TYPE_TIME: *var = 'T'; break; |
| 263 | default: *var = 0; |
| 264 | } // endswitch mytype |
| 265 | |
| 266 | return type; |
| 267 | } // end of MYSQLtoPLG |
| 268 | |
| 269 | /************************************************************************/ |
| 270 | /* Returns the format corresponding to a MySQL date type number. */ |
| 271 | /************************************************************************/ |
| 272 | PCSZ MyDateFmt(int mytype) |
| 273 | { |
| 274 | PCSZ fmt; |
| 275 | |
| 276 | switch (mytype) { |
| 277 | case MYSQL_TYPE_TIMESTAMP: |
| 278 | case MYSQL_TYPE_DATETIME: |
| 279 | fmt = "YYYY-MM-DD hh:mm:ss" ; |
| 280 | break; |
| 281 | case MYSQL_TYPE_DATE: |
| 282 | fmt = "YYYY-MM-DD" ; |
| 283 | break; |
| 284 | case MYSQL_TYPE_YEAR: |
| 285 | fmt = "YYYY" ; |
| 286 | break; |
| 287 | case MYSQL_TYPE_TIME: |
| 288 | fmt = "hh:mm:ss" ; |
| 289 | break; |
| 290 | default: |
| 291 | fmt = NULL; |
| 292 | } // endswitch mytype |
| 293 | |
| 294 | return fmt; |
| 295 | } // end of MyDateFmt |
| 296 | |
| 297 | /************************************************************************/ |
| 298 | /* Returns the format corresponding to a MySQL date type name. */ |
| 299 | /************************************************************************/ |
| 300 | PCSZ MyDateFmt(char *typname) |
| 301 | { |
| 302 | PCSZ fmt; |
| 303 | |
| 304 | if (!stricmp(typname, "datetime" ) || !stricmp(typname, "timestamp" )) |
| 305 | fmt = "YYYY-MM-DD hh:mm:ss" ; |
| 306 | else if (!stricmp(typname, "date" )) |
| 307 | fmt = "YYYY-MM-DD" ; |
| 308 | else if (!stricmp(typname, "year" )) |
| 309 | fmt = "YYYY" ; |
| 310 | else if (!stricmp(typname, "time" )) |
| 311 | fmt = "hh:mm:ss" ; |
| 312 | else |
| 313 | fmt = NULL; |
| 314 | |
| 315 | return fmt; |
| 316 | } // end of MyDateFmt |
| 317 | |
| 318 | |