DataType.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:11k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include "DataType.hpp"
  14. // SqlType
  15. SqlType::SqlType() :
  16.     m_type(Undef)
  17. {
  18. }
  19. SqlType::SqlType(Type type, bool nullable)
  20. {
  21.     Ctx ctx;
  22.     setType(ctx, type, nullable);
  23.     ctx_assert(ctx.ok());
  24. }
  25. SqlType::SqlType(Type type, unsigned length, bool nullable)
  26. {
  27.     Ctx ctx;
  28.     setType(ctx, type, length, nullable);
  29.     ctx_assert(ctx.ok());
  30. }
  31. SqlType::SqlType(Type type, unsigned precision, unsigned scale, bool nullable)
  32. {
  33.     Ctx ctx;
  34.     setType(ctx, type, precision, scale, nullable);
  35.     ctx_assert(ctx.ok());
  36. }
  37. SqlType::SqlType(Ctx& ctx, Type type, bool nullable)
  38. {
  39.     setType(ctx, type, nullable);
  40. }
  41. SqlType::SqlType(Ctx& ctx, Type type, unsigned length, bool nullable)
  42. {
  43.     setType(ctx, type, length, nullable);
  44. }
  45. SqlType::SqlType(Ctx& ctx, Type type, unsigned precision, unsigned scale, bool nullable)
  46. {
  47.     setType(ctx, type, precision, scale, nullable);
  48. }
  49. SqlType::SqlType(Ctx& ctx, const NdbDictionary::Column* ndbColumn)
  50. {
  51.     setType(ctx, ndbColumn);
  52. }
  53. void
  54. SqlType::setType(Ctx& ctx, Type type, bool nullable)
  55. {
  56.     switch (type) {
  57.     case Smallint:
  58.     case Integer:
  59.     case Bigint:
  60.     case Real:
  61.     case Double:
  62.     case Datetime:
  63. break;
  64.     case Blob:
  65. setType(ctx, Varbinary, FAKE_BLOB_SIZE, nullable); // XXX BLOB hack
  66. return;
  67.     case Clob:
  68. setType(ctx, Varchar, FAKE_BLOB_SIZE, nullable); // XXX BLOB hack
  69. return;
  70.     case Null:
  71.     case Unbound:
  72. break;
  73.     default:
  74. ctx_assert(false);
  75. break;
  76.     }
  77.     m_type = type;
  78.     m_precision = 0;
  79.     m_scale = 0;
  80.     m_length = 0;
  81.     m_nullable = nullable;
  82.     m_unSigned = false;
  83. }
  84. void
  85. SqlType::setType(Ctx& ctx, Type type, unsigned length, bool nullable)
  86. {
  87.     switch (type) {
  88.     case Char:
  89.     case Varchar:
  90.     case Binary:
  91.     case Varbinary:
  92. break;
  93.     default:
  94. ctx_assert(false);
  95. break;
  96.     }
  97.     m_type = type;
  98.     m_precision = 0;
  99.     m_scale = 0;
  100.     m_length = length;
  101.     m_nullable = nullable;
  102.     m_unSigned = false;
  103. }
  104. void
  105. SqlType::setType(Ctx& ctx, Type type, unsigned precision, unsigned scale, bool nullable)
  106. {
  107.     ctx_assert(false); // not yet
  108. }
  109. void
  110. SqlType::setType(Ctx& ctx, const NdbDictionary::Column* ndbColumn)
  111. {
  112.     NdbDictionary::Column::Type type = ndbColumn->getType();
  113.     unsigned length = ndbColumn->getLength();
  114.     unsigned precision = ndbColumn->getPrecision();
  115.     unsigned scale = ndbColumn->getScale();
  116.     bool nullable = ndbColumn->getNullable();
  117.     switch (type) {
  118.     case NdbDictionary::Column::Undefined:
  119. break;
  120.     case NdbDictionary::Column::Int:
  121. if (length == 1)
  122.     setType(ctx, Integer, nullable);
  123. else
  124.     setType(ctx, Binary, length * sizeof(SqlInteger), nullable);
  125. return;
  126.     case NdbDictionary::Column::Unsigned:
  127. if (length == 1) {
  128.     setType(ctx, Integer, nullable);
  129.     unSigned(true);
  130. } else
  131.     setType(ctx, Binary, length * sizeof(SqlUinteger), nullable);
  132. return;
  133.     case NdbDictionary::Column::Bigint:
  134. if (length == 1)
  135.     setType(ctx, Bigint, nullable);
  136. else
  137.     setType(ctx, Binary, length * sizeof(SqlBigint), nullable);
  138. return;
  139.     case NdbDictionary::Column::Bigunsigned:
  140. if (length == 1) {
  141.     setType(ctx, Bigint, nullable);
  142.     unSigned(true);
  143. } else
  144.     setType(ctx, Binary, length * sizeof(SqlBigint), nullable);
  145. return;
  146.     case NdbDictionary::Column::Float:
  147. if (length == 1)
  148.     setType(ctx, Real, nullable);
  149. else
  150.     setType(ctx, Binary, length * sizeof(SqlReal), nullable);
  151. return;
  152.     case NdbDictionary::Column::Double:
  153. if (length == 1)
  154.     setType(ctx, Double, nullable);
  155. else
  156.     setType(ctx, Binary, length * sizeof(SqlDouble), nullable);
  157. return;
  158.     case NdbDictionary::Column::Decimal:
  159. setType(ctx, Decimal, precision, scale, nullable);
  160. return;
  161.     case NdbDictionary::Column::Char:
  162. setType(ctx, Char, length, nullable);
  163. return;
  164.     case NdbDictionary::Column::Varchar:
  165. setType(ctx, Varchar, length, nullable);
  166. return;
  167.     case NdbDictionary::Column::Binary:
  168. setType(ctx, Binary, length, nullable);
  169. return;
  170.     case NdbDictionary::Column::Varbinary:
  171. setType(ctx, Varbinary, length, nullable);
  172. return;
  173.     case NdbDictionary::Column::Datetime:
  174. // XXX not yet
  175. break;
  176.     case NdbDictionary::Column::Timespec:
  177. setType(ctx, Datetime, nullable);
  178. return;
  179.     case NdbDictionary::Column::Blob:
  180. setType(ctx, Blob, nullable);
  181. return;
  182.     case NdbDictionary::Column::Clob:
  183. setType(ctx, Clob, nullable);
  184. return;
  185.     default:
  186. break;
  187.     }
  188.     ctx.pushStatus(Error::Gen, "unsupported NDB type %d", (signed)type);
  189. }
  190. bool
  191. SqlType::equal(const SqlType& sqlType) const
  192. {
  193.     return
  194. m_type == sqlType.m_type &&
  195. m_precision == sqlType.m_precision &&
  196. m_scale == sqlType.m_scale &&
  197. m_length == sqlType.m_length;
  198. }
  199. unsigned
  200. SqlType::size() const
  201. {
  202.     switch (m_type) {
  203.     case Char:
  204.     case Varchar:
  205.     case Binary:
  206.     case Varbinary:
  207. return m_length;
  208.     case Smallint:
  209. return sizeof(SqlSmallint);
  210.     case Integer:
  211. return sizeof(SqlInteger);
  212.     case Bigint:
  213. return sizeof(SqlBigint);
  214.     case Real:
  215. return sizeof(SqlReal);
  216.     case Double:
  217. return sizeof(SqlDouble);
  218.     case Datetime:
  219. return sizeof(SqlDatetime);
  220.     case Null:
  221. return 0;
  222.     default:
  223. break;
  224.     }
  225.     ctx_assert(false);
  226.     return 0;
  227. }
  228. unsigned
  229. SqlType::displaySize() const
  230. {
  231.     switch (m_type) {
  232.     case Char:
  233.     case Varchar:
  234. return m_length;
  235.     case Binary:
  236.     case Varbinary:
  237. return m_length;
  238.     case Smallint:
  239. return m_unSigned ? 5 : 6;
  240.     case Integer:
  241. return m_unSigned ? 10 : 11;
  242.     case Bigint:
  243. return m_unSigned ? 20 : 21;
  244.     case Real:
  245. return 10;
  246.     case Double:
  247. return 20;
  248.     case Datetime:
  249. return 30;
  250.     case Null:
  251. return 0;
  252.     default:
  253. break;
  254.     }
  255.     ctx_assert(false);
  256.     return 0;
  257. }
  258. void
  259. SqlType::getType(Ctx& ctx, NdbDictionary::Column* ndbColumn) const
  260. {
  261.     switch (m_type) {
  262.     case Char:
  263. ndbColumn->setType(NdbDictionary::Column::Char);
  264. ndbColumn->setLength(m_length);
  265. break;
  266.     case Varchar:
  267. ndbColumn->setType(NdbDictionary::Column::Varchar);
  268. ndbColumn->setLength(m_length);
  269. break;
  270.     case Binary:
  271. ndbColumn->setType(NdbDictionary::Column::Binary);
  272. ndbColumn->setLength(m_length);
  273. break;
  274.     case Varbinary:
  275. ndbColumn->setType(NdbDictionary::Column::Varbinary);
  276. ndbColumn->setLength(m_length);
  277. break;
  278.     case Smallint:
  279. break; // XXX
  280.     case Integer:
  281. if (! m_unSigned)
  282.     ndbColumn->setType(NdbDictionary::Column::Int);
  283. else
  284.     ndbColumn->setType(NdbDictionary::Column::Unsigned);
  285. ndbColumn->setLength(1);
  286. break;
  287.     case Bigint:
  288. if (! m_unSigned)
  289.     ndbColumn->setType(NdbDictionary::Column::Bigint);
  290. else
  291.     ndbColumn->setType(NdbDictionary::Column::Bigunsigned);
  292. ndbColumn->setLength(1);
  293. break;
  294.     case Real:
  295. ndbColumn->setType(NdbDictionary::Column::Float);
  296. ndbColumn->setLength(1);
  297. break;
  298.     case Double:
  299. ndbColumn->setType(NdbDictionary::Column::Double);
  300. ndbColumn->setLength(1);
  301. break;
  302.     case Datetime:
  303. ndbColumn->setType(NdbDictionary::Column::Timespec);
  304. ndbColumn->setLength(1);
  305. break;
  306.     default:
  307. ctx_assert(false);
  308. break;
  309.     }
  310.     ndbColumn->setNullable(m_nullable);
  311. }
  312. const char*
  313. SqlType::typeName() const
  314. {
  315.     switch (m_type) {
  316.     case Char:
  317. return "CHAR";
  318.     case Varchar:
  319. return "VARCHAR";
  320.     case Binary:
  321. return "BINARY";
  322.     case Varbinary:
  323. return "VARBINARY";
  324.     case Smallint:
  325. return "SMALLINT";
  326.     case Integer:
  327. return "INTEGER";
  328.     case Bigint:
  329. return "BIGINT";
  330.     case Real:
  331. return "REAL";
  332.     case Double:
  333. return "FLOAT";
  334.     case Datetime:
  335. return "DATETIME";
  336.     default:
  337. break;
  338.     }
  339.     return "UNKNOWN";
  340. }
  341. void
  342. SqlType::print(char* buf, unsigned size) const
  343. {
  344.     switch (m_type) {
  345.     case Char:
  346. snprintf(buf, size, "char(%d)", m_length);
  347. break;
  348.     case Varchar:
  349. snprintf(buf, size, "varchar(%d)", m_length);
  350. break;
  351.     case Binary:
  352. snprintf(buf, size, "binary(%d)", m_length);
  353. break;
  354.     case Varbinary:
  355. snprintf(buf, size, "varbinary(%d)", m_length);
  356. break;
  357.     case Smallint:
  358. snprintf(buf, size, "smallint%s", m_unSigned ? " unsigned" : "");
  359. break;
  360.     case Integer:
  361. snprintf(buf, size, "integer%s", m_unSigned ? " unsigned" : "");
  362. break;
  363.     case Bigint:
  364. snprintf(buf, size, "bigint%s", m_unSigned ? " unsigned" : "");
  365. break;
  366.     case Real:
  367. snprintf(buf, size, "real");
  368. break;
  369.     case Double:
  370. snprintf(buf, size, "double");
  371. break;
  372.     case Datetime:
  373. snprintf(buf, size, "datetime");
  374. break;
  375.     case Null:
  376. snprintf(buf, size, "null");
  377. break;
  378.     case Unbound:
  379. snprintf(buf, size, "unbound");
  380. break;
  381.     default:
  382. snprintf(buf, size, "sqltype(%d)", (int)m_type);
  383. break;
  384.     }
  385. }
  386. // ExtType
  387. ExtType::ExtType() :
  388.     m_type(Undef)
  389. {
  390. }
  391. ExtType::ExtType(Type type)
  392. {
  393.     Ctx ctx;
  394.     setType(ctx, type);
  395.     ctx_assert(ctx.ok());
  396. }
  397. ExtType::ExtType(Ctx& ctx, Type type)
  398. {
  399.     setType(ctx, type);
  400. }
  401. void
  402. ExtType::setType(Ctx& ctx, Type type)
  403. {
  404.     switch (type) {
  405.     case Char:
  406.     case Short:
  407.     case Sshort:
  408.     case Ushort:
  409.     case Long:
  410.     case Slong:
  411.     case Ulong:
  412.     case Sbigint:
  413.     case Ubigint:
  414.     case Float:
  415.     case Double:
  416.     case Timestamp:
  417.     case Binary: // XXX BLOB hack
  418.     case Unbound:
  419. break;
  420.     default:
  421. ctx.pushStatus(Error::Gen, "unsupported external type %d", (int)type);
  422. return;
  423.     }
  424.     m_type = type;
  425. }
  426. unsigned
  427. ExtType::size() const
  428. {
  429.     ctx_assert(false);
  430.     return 0;
  431. }
  432. // LexType
  433. LexType::LexType() :
  434.     m_type(Undef)
  435. {
  436. }
  437. LexType::LexType(Type type)
  438. {
  439.     Ctx ctx;
  440.     setType(ctx, type);
  441.     ctx_assert(ctx.ok());
  442. }
  443. LexType::LexType(Ctx& ctx, Type type)
  444. {
  445.     setType(ctx, type);
  446. }
  447. void
  448. LexType::setType(Ctx& ctx, Type type)
  449. {
  450.     switch (type) {
  451.     case Char:
  452.     case Integer:
  453.     case Float:
  454.     case Null:
  455. break;
  456.     default:
  457. ctx_assert(false);
  458. break;
  459.     }
  460.     m_type = type;
  461. }
  462. // convert types
  463. SQLSMALLINT
  464. SqlType::sqlcdefault(Ctx& ctx) const
  465. {
  466.     switch (m_type) {
  467.     case Char:
  468. return SQL_C_CHAR;
  469.     case Varchar:
  470. return SQL_C_CHAR;
  471.     case Binary:
  472. return SQL_C_BINARY;
  473.     case Varbinary:
  474. return SQL_C_BINARY;
  475.     case Smallint:
  476. return m_unSigned ? SQL_C_USHORT : SQL_C_SSHORT;
  477.     case Integer:
  478. return m_unSigned ? SQL_C_ULONG : SQL_C_SLONG;
  479.     case Bigint:
  480. return SQL_C_CHAR;
  481. // or maybe this
  482. return m_unSigned ? SQL_C_UBIGINT : SQL_C_SBIGINT;
  483.     case Real:
  484. return SQL_C_FLOAT;
  485.     case Double:
  486. return SQL_C_DOUBLE;
  487.     case Datetime:
  488. return SQL_C_TYPE_TIMESTAMP;
  489.     default:
  490. break;
  491.     }
  492.     return SQL_C_DEFAULT; // no default
  493. }
  494. void
  495. LexType::convert(Ctx& ctx, SqlType& out, unsigned length) const
  496. {
  497.     switch (m_type) {
  498.     case Char:
  499. out.setType(ctx, SqlType::Char, length, true);
  500. return;
  501.     case Integer:
  502. out.setType(ctx, SqlType::Bigint, false);
  503. return;
  504.     case Float:
  505. out.setType(ctx, SqlType::Double, false);
  506. return;
  507.     case Null:
  508. out.setType(ctx, SqlType::Null, true);
  509. return;
  510.     default:
  511. break;
  512.     }
  513.     ctx.pushStatus(Error::Gen, "unsupported lexical to SQL type conversion");
  514. }