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

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 <NDBT.hpp>
  14. #include <NDBT_Table.hpp>
  15. #include <NDBT_Tables.hpp>
  16. /* ******************************************************* */
  17. //    Define Ndb standard tables 
  18. //
  19. //  USE ONLY UPPERLETTERS IN TAB AND COLUMN NAMES
  20. /* ******************************************************* */
  21. /*
  22.  * These are our "official" test tables
  23.  *
  24.  */
  25. /* T1 */
  26. static
  27. const
  28. NDBT_Attribute T1Attribs[] = {
  29.   NDBT_Attribute("KOL1", NdbDictionary::Column::Unsigned, 1, true), 
  30.   NDBT_Attribute("KOL2", NdbDictionary::Column::Unsigned),
  31.   NDBT_Attribute("KOL3", NdbDictionary::Column::Unsigned),
  32.   NDBT_Attribute("KOL4", NdbDictionary::Column::Unsigned),
  33.   NDBT_Attribute("KOL5", NdbDictionary::Column::Unsigned),
  34. };
  35. static
  36. const
  37. NDBT_Table T1("T1", sizeof(T1Attribs)/sizeof(NDBT_Attribute), T1Attribs);
  38. /* T2 */
  39. static
  40. const
  41. NDBT_Attribute T2Attribs[] = {
  42.   NDBT_Attribute("KOL1", NdbDictionary::Column::Bigunsigned, 1, true), 
  43.   NDBT_Attribute("KOL2", NdbDictionary::Column::Unsigned),
  44.   NDBT_Attribute("KOL3", NdbDictionary::Column::Unsigned),
  45.   NDBT_Attribute("KOL4", NdbDictionary::Column::Unsigned, 
  46.  1, false, true), // Nullable 
  47.   NDBT_Attribute("KOL5", NdbDictionary::Column::Unsigned)
  48. };
  49. static
  50. const
  51. NDBT_Table T2("T2", sizeof(T2Attribs)/sizeof(NDBT_Attribute), T2Attribs);
  52. /* T3 */
  53. static
  54. const
  55. NDBT_Attribute T3Attribs[] = {
  56.   NDBT_Attribute("ID", NdbDictionary::Column::Unsigned, 1, true), 
  57.   NDBT_Attribute("PERSNR", NdbDictionary::Column::Char, 10),
  58.   NDBT_Attribute("NAME", NdbDictionary::Column::Char, 25),
  59.   NDBT_Attribute("ADRESS", NdbDictionary::Column::Char, 50),
  60.   NDBT_Attribute("ADRESS2", NdbDictionary::Column::Char, 
  61.  30, false, true), // Nullable
  62.   NDBT_Attribute("F諨ELSE臨", NdbDictionary::Column::Unsigned)
  63. };
  64. static
  65. const
  66. NDBT_Table T3("T3", sizeof(T3Attribs)/sizeof(NDBT_Attribute), T3Attribs);
  67. /* T4 */
  68. static
  69. const
  70. NDBT_Attribute T4Attribs[] = {
  71.   NDBT_Attribute("REGNR", NdbDictionary::Column::Char, 6, true), 
  72.   NDBT_Attribute("YEAR", NdbDictionary::Column::Unsigned),
  73.   NDBT_Attribute("OWNER", NdbDictionary::Column::Char, 25),
  74.   NDBT_Attribute("ADRESS", NdbDictionary::Column::Char, 50),
  75.   NDBT_Attribute("ADRESS2", NdbDictionary::Column::Char, 
  76.  30, false, true), // Nullable
  77.   NDBT_Attribute("OWNERID", NdbDictionary::Column::Unsigned),
  78.   NDBT_Attribute("CHECKDATE", NdbDictionary::Column::Unsigned)
  79. };
  80. static
  81. const
  82. NDBT_Table T4("T4", sizeof(T4Attribs)/sizeof(NDBT_Attribute), T4Attribs);
  83. /* T5 */
  84. static
  85. const
  86. NDBT_Attribute T5Attribs[] = {
  87.   NDBT_Attribute("OWNERID", NdbDictionary::Column::Unsigned, 1, true), 
  88.   NDBT_Attribute("REGNR", NdbDictionary::Column::Char, 6, true),
  89.   NDBT_Attribute("CREATEDDATE", NdbDictionary::Column::Unsigned)
  90. };
  91. static
  92. const
  93. NDBT_Table T5("T5", sizeof(T5Attribs)/sizeof(NDBT_Attribute), T5Attribs);
  94. /* T6 */
  95. static
  96. const
  97. NDBT_Attribute T6Attribs[] = {
  98.   NDBT_Attribute("PK1", NdbDictionary::Column::Unsigned, 1, true), 
  99.   NDBT_Attribute("ATTR1", NdbDictionary::Column::Unsigned),
  100.   NDBT_Attribute("ATTR2", NdbDictionary::Column::Unsigned),
  101.   NDBT_Attribute("ATTR3", NdbDictionary::Column::Unsigned),
  102.   NDBT_Attribute("ATTR4", NdbDictionary::Column::Char, 
  103.  47, false, true),// Nullable
  104.   NDBT_Attribute("ATTR5", NdbDictionary::Column::Unsigned),
  105.   NDBT_Attribute("ATTR6", NdbDictionary::Column::Unsigned),
  106.   NDBT_Attribute("ATTR7", NdbDictionary::Column::Char, 
  107.  48, false, true),// Nullable
  108.   NDBT_Attribute("ATTR8", NdbDictionary::Column::Char, 
  109.  50, false, true), // Nullable
  110.   NDBT_Attribute("ATTR9", NdbDictionary::Column::Int),
  111.   NDBT_Attribute("ATTR10", NdbDictionary::Column::Float),
  112.   NDBT_Attribute("ATTR11", NdbDictionary::Column::Unsigned),
  113.   NDBT_Attribute("ATTR12", NdbDictionary::Column::Char, 49),
  114.   NDBT_Attribute("ATTR13", NdbDictionary::Column::Unsigned),
  115.   NDBT_Attribute("ATTR14", NdbDictionary::Column::Char, 50),
  116.   NDBT_Attribute("ATTR15", NdbDictionary::Column::Unsigned),
  117.   NDBT_Attribute("ATTR16", NdbDictionary::Column::Unsigned),
  118.   NDBT_Attribute("ATTR17", NdbDictionary::Column::Unsigned),
  119.   NDBT_Attribute("ATTR18", NdbDictionary::Column::Char, 257),
  120.   NDBT_Attribute("ATTR19", NdbDictionary::Column::Unsigned),
  121.   NDBT_Attribute("ATTR20", NdbDictionary::Column::Unsigned),
  122. };
  123. static
  124. const
  125. NDBT_Table T6("T6", sizeof(T6Attribs)/sizeof(NDBT_Attribute), T6Attribs);
  126. /* T7 */
  127. static
  128. const
  129. NDBT_Attribute T7Attribs[] = {
  130.   NDBT_Attribute("PK1", NdbDictionary::Column::Unsigned, 1, true), 
  131.   NDBT_Attribute("PK2", NdbDictionary::Column::Unsigned, 1, true), 
  132.   NDBT_Attribute("PK3", NdbDictionary::Column::Unsigned, 1, true), 
  133.   NDBT_Attribute("PK4", NdbDictionary::Column::Unsigned, 1, true), 
  134.   NDBT_Attribute("ATTR1", NdbDictionary::Column::Unsigned),
  135.   NDBT_Attribute("ATTR2", NdbDictionary::Column::Unsigned),
  136.   NDBT_Attribute("ATTR3", NdbDictionary::Column::Unsigned),
  137.   NDBT_Attribute("ATTR4", NdbDictionary::Column::Unsigned),
  138.   NDBT_Attribute("ATTR5", NdbDictionary::Column::Unsigned),
  139.   NDBT_Attribute("ATTR6", NdbDictionary::Column::Unsigned),
  140.   NDBT_Attribute("ATTR7", NdbDictionary::Column::Unsigned),
  141.   NDBT_Attribute("ATTR8", NdbDictionary::Column::Unsigned),
  142.   NDBT_Attribute("ATTR9", NdbDictionary::Column::Unsigned),
  143.   NDBT_Attribute("ATTR10", NdbDictionary::Column::Unsigned),
  144.   NDBT_Attribute("ATTR11", NdbDictionary::Column::Unsigned),
  145.   NDBT_Attribute("ATTR12", NdbDictionary::Column::Char, 259),
  146.   NDBT_Attribute("ATTR13", NdbDictionary::Column::Unsigned),
  147.   NDBT_Attribute("ATTR14", NdbDictionary::Column::Unsigned),
  148.   NDBT_Attribute("ATTR15", NdbDictionary::Column::Unsigned),
  149.   NDBT_Attribute("ATTR16", NdbDictionary::Column::Unsigned),
  150.   NDBT_Attribute("ATTR17", NdbDictionary::Column::Unsigned),
  151.   NDBT_Attribute("ATTR18", NdbDictionary::Column::Unsigned),
  152.   NDBT_Attribute("ATTR19", NdbDictionary::Column::Unsigned),
  153.   NDBT_Attribute("ATTR20", NdbDictionary::Column::Unsigned),
  154. };
  155. static
  156. const
  157. NDBT_Table T7("T7", sizeof(T7Attribs)/sizeof(NDBT_Attribute), T7Attribs);
  158. /* T8 */
  159. static
  160. const
  161. NDBT_Attribute T8Attribs[] = {
  162.   NDBT_Attribute("PERSON_ID", NdbDictionary::Column::Unsigned, 1, true), 
  163.   NDBT_Attribute("NAME", NdbDictionary::Column::Char, 257),
  164.   NDBT_Attribute("ADRESS", NdbDictionary::Column::Char, 513),
  165.   NDBT_Attribute("POSTADRESS", NdbDictionary::Column::Char, 1173),
  166.   NDBT_Attribute("VALUE", NdbDictionary::Column::Unsigned),
  167.   
  168. };
  169. static
  170. const
  171. NDBT_Table T8("T8", sizeof(T8Attribs)/sizeof(NDBT_Attribute), T8Attribs);
  172. /* T9 */
  173. static
  174. const
  175. NDBT_Attribute T9Attribs[] = {
  176.   NDBT_Attribute("KF_SKAPAD", NdbDictionary::Column::Unsigned, 1, true), 
  177.   NDBT_Attribute("PLATS_ID", NdbDictionary::Column::Char, 2, true),
  178.   NDBT_Attribute("TNR_SKAPAD", NdbDictionary::Column::Char, 12, true),
  179.   NDBT_Attribute("DELG_MOT", NdbDictionary::Column::Char, 1, true),
  180.   NDBT_Attribute("VALUE", NdbDictionary::Column::Unsigned),
  181. };
  182. static
  183. const
  184. NDBT_Table T9("T9", sizeof(T9Attribs)/sizeof(NDBT_Attribute), T9Attribs);
  185. /* T10 - Long key table */
  186. static
  187. const
  188. NDBT_Attribute T10Attribs[] = {
  189.   NDBT_Attribute("KOL1", NdbDictionary::Column::Char, 256, true), 
  190.   NDBT_Attribute("KOL2", NdbDictionary::Column::Unsigned),
  191.   NDBT_Attribute("KOL3", NdbDictionary::Column::Char, 257),
  192.   NDBT_Attribute("KOL4", NdbDictionary::Column::Unsigned),
  193.   NDBT_Attribute("KOL5", NdbDictionary::Column::Unsigned),
  194. };
  195. static
  196. const
  197. NDBT_Table T10("T10", sizeof(T10Attribs)/sizeof(NDBT_Attribute), T10Attribs);
  198. /* T11 - Primary key is not first attribute */
  199. static
  200. const
  201. NDBT_Attribute T11Attribs[] = {
  202.   NDBT_Attribute("KOL1", NdbDictionary::Column::Unsigned),
  203.   NDBT_Attribute("KOL2", NdbDictionary::Column::Unsigned, 1, true), 
  204.   NDBT_Attribute("KOL3", NdbDictionary::Column::Unsigned),
  205.   NDBT_Attribute("KOL4", NdbDictionary::Column::Char, 111),
  206.   NDBT_Attribute("KOL5", NdbDictionary::Column::Char, 113)
  207. };
  208. static
  209. const
  210. NDBT_Table T11("T11", sizeof(T11Attribs)/sizeof(NDBT_Attribute), T11Attribs);
  211. /* T12 - 16 primary keys */
  212. static
  213. const
  214. NDBT_Attribute T12Attribs[] = {
  215.   NDBT_Attribute("KOL1", NdbDictionary::Column::Unsigned, 1, true), 
  216.   NDBT_Attribute("KOL2", NdbDictionary::Column::Unsigned, 1, true), 
  217.   NDBT_Attribute("KOL3", NdbDictionary::Column::Unsigned, 1, true), 
  218.   NDBT_Attribute("KOL4", NdbDictionary::Column::Unsigned, 1, true), 
  219.   NDBT_Attribute("KOL5", NdbDictionary::Column::Unsigned, 1, true), 
  220.   NDBT_Attribute("KOL6", NdbDictionary::Column::Unsigned, 1, true), 
  221.   NDBT_Attribute("KOL7", NdbDictionary::Column::Unsigned, 1, true), 
  222.   NDBT_Attribute("KOL8", NdbDictionary::Column::Unsigned, 1, true), 
  223.   NDBT_Attribute("KOL9", NdbDictionary::Column::Unsigned, 1, true), 
  224.   NDBT_Attribute("KOL10", NdbDictionary::Column::Unsigned, 1, true), 
  225.   NDBT_Attribute("KOL11", NdbDictionary::Column::Unsigned, 1, true), 
  226.   NDBT_Attribute("KOL12", NdbDictionary::Column::Unsigned, 1, true), 
  227.   NDBT_Attribute("KOL13", NdbDictionary::Column::Unsigned, 1, true), 
  228.   NDBT_Attribute("KOL14", NdbDictionary::Column::Unsigned, 1, true), 
  229.   NDBT_Attribute("KOL15", NdbDictionary::Column::Unsigned, 1, true), 
  230.   NDBT_Attribute("KOL16", NdbDictionary::Column::Unsigned, 1, true), 
  231.   NDBT_Attribute("KOL20", NdbDictionary::Column::Unsigned),
  232.   NDBT_Attribute("KOL30", NdbDictionary::Column::Unsigned),
  233.   NDBT_Attribute("KOL40", NdbDictionary::Column::Unsigned),
  234.   NDBT_Attribute("KOL50", NdbDictionary::Column::Unsigned)
  235. };
  236. static
  237. const
  238. NDBT_Table T12("T12", sizeof(T12Attribs)/sizeof(NDBT_Attribute), T12Attribs);
  239. /* T13 - Long key table */
  240. static
  241. const
  242. NDBT_Attribute T13Attribs[] = {
  243.   NDBT_Attribute("KOL1", NdbDictionary::Column::Char, 257, true), 
  244.   NDBT_Attribute("KOL2", NdbDictionary::Column::Char, 259, true),
  245.   NDBT_Attribute("KOL3", NdbDictionary::Column::Char, 113, true),
  246.   NDBT_Attribute("KOL4", NdbDictionary::Column::Unsigned),
  247.   NDBT_Attribute("KOL5", NdbDictionary::Column::Unsigned, 1, true),
  248.   NDBT_Attribute("KOL6", NdbDictionary::Column::Unsigned),
  249. };
  250. static
  251. const
  252. NDBT_Table T13("T13", sizeof(T13Attribs)/sizeof(NDBT_Attribute), T13Attribs);
  253. /* T14 - 5 primary keys */
  254. static
  255. const
  256. NDBT_Attribute T14Attribs[] = {
  257.   NDBT_Attribute("KOL1", NdbDictionary::Column::Unsigned, 1, true), 
  258.   NDBT_Attribute("KOL2", NdbDictionary::Column::Unsigned, 1, true), 
  259.   NDBT_Attribute("KOL3", NdbDictionary::Column::Char, 4, true), 
  260.   NDBT_Attribute("KOL4", NdbDictionary::Column::Unsigned, 1, true), 
  261.   NDBT_Attribute("KOL5", NdbDictionary::Column::Unsigned, 1, true), 
  262.   NDBT_Attribute("KOL20", NdbDictionary::Column::Unsigned),
  263.   NDBT_Attribute("KOL30", NdbDictionary::Column::Int),
  264.   NDBT_Attribute("KOL40", NdbDictionary::Column::Float),
  265.   NDBT_Attribute("KOL50", NdbDictionary::Column::Char, 200)
  266. };
  267. static
  268. const
  269. NDBT_Table T14("T14", sizeof(T14Attribs)/sizeof(NDBT_Attribute), T14Attribs);
  270. /*
  271.   C2 DHCP TABLES, MAYBE THESE SHOULD BE MOVED TO THE UTIL_TABLES?
  272. */
  273. static 
  274. const
  275. NDBT_Attribute I1_Cols[] = {
  276.   NDBT_Attribute("ID", NdbDictionary::Column::Unsigned, true),
  277.   NDBT_Attribute("PORT", NdbDictionary::Column::Char, 16, true),
  278.   NDBT_Attribute("ACCESSNODE", NdbDictionary::Column::Char, 16, true),
  279.   NDBT_Attribute("POP", NdbDictionary::Column::Char, 64, true),
  280.   NDBT_Attribute("VLAN", NdbDictionary::Column::Char, 16),
  281.   NDBT_Attribute("COMMENT", NdbDictionary::Column::Char, 128),
  282.   NDBT_Attribute("SNMPINDEX", NdbDictionary::Column::Int),
  283.   NDBT_Attribute("PORTSTATE", NdbDictionary::Column::Int),
  284.   NDBT_Attribute("UPDATES", NdbDictionary::Column::Unsigned)
  285. };
  286. static
  287. const
  288. char* I1_Indexes[] = {
  289.   "UNIQUE", "ID", "PORT", "ACCESSNODE", "POP", "PORTSTATE", 0,
  290.   0
  291. };
  292. static
  293. NDBT_Table I1("I1", sizeof(I1_Cols)/sizeof(NDBT_Attribute), I1_Cols
  294.       );// ,I1_Indexes);
  295. static 
  296. const
  297. NDBT_Attribute I2_Cols[] = {
  298.   NDBT_Attribute("ID", NdbDictionary::Column::Unsigned, true),
  299.   NDBT_Attribute("PORT", NdbDictionary::Column::Char, 16, true),
  300.   NDBT_Attribute("ACCESSNODE", NdbDictionary::Column::Char, 16, true),
  301.   NDBT_Attribute("POP", NdbDictionary::Column::Char, 64, true),
  302.   NDBT_Attribute("ACCESSTYPE", NdbDictionary::Column::Int, true),
  303.   NDBT_Attribute("CUSTOMER_ID", NdbDictionary::Column::Int),
  304.   NDBT_Attribute("PROVIDER", NdbDictionary::Column::Int),
  305.   NDBT_Attribute("TEXPIRE", NdbDictionary::Column::Int),
  306.   NDBT_Attribute("NUM_IP", NdbDictionary::Column::Int),
  307.   NDBT_Attribute("LEASED_NUM_IP", NdbDictionary::Column::Int),
  308.   NDBT_Attribute("LOCKED_IP", NdbDictionary::Column::Int),
  309.   NDBT_Attribute("STATIC_DNS", NdbDictionary::Column::Int),
  310.   NDBT_Attribute("SUSPENDED_SERVICES", NdbDictionary::Column::Int),
  311.   NDBT_Attribute("UPDATES", NdbDictionary::Column::Unsigned)
  312. };
  313. const
  314. char* I2_Indexes[] = {
  315.   "ORDERED", "CUSTOMER_ID", 0,
  316.   "ORDERED", "NUM_IP", 0,
  317.   0
  318. };
  319. static
  320. NDBT_Table I2("I2", sizeof(I2_Cols)/sizeof(NDBT_Attribute), I2_Cols
  321.       );//, I2_Indexes);
  322. static 
  323. const
  324. NDBT_Attribute I3_Cols[] = {
  325.   NDBT_Attribute("ID", NdbDictionary::Column::Unsigned, true),
  326.   NDBT_Attribute("PORT", NdbDictionary::Column::Char, 16), // SI2
  327.   NDBT_Attribute("ACCESSNODE", NdbDictionary::Column::Char, 16), // SI2
  328.   NDBT_Attribute("POP", NdbDictionary::Column::Char, 64), // SI2
  329.   NDBT_Attribute("MAC", NdbDictionary::Column::Char, 12, true), 
  330.   NDBT_Attribute("MAC_EXPIRE", NdbDictionary::Column::Int, 1),
  331.   NDBT_Attribute("IIP", NdbDictionary::Column::Int), // SI1
  332.   NDBT_Attribute("P_EXPIRE", NdbDictionary::Column::Int),
  333.   NDBT_Attribute("HOSTNAME", NdbDictionary::Column::Char, 32),
  334.   NDBT_Attribute("DETECTED", NdbDictionary::Column::Int),
  335.   NDBT_Attribute("STATUS", NdbDictionary::Column::Int),
  336.   NDBT_Attribute("NUM_REQUESTS", NdbDictionary::Column::Int),
  337.   NDBT_Attribute("ACCESSTYPE", NdbDictionary::Column::Int),
  338.   NDBT_Attribute("OS_TYPE", NdbDictionary::Column::Int),
  339.   NDBT_Attribute("GW", NdbDictionary::Column::Int),
  340.   NDBT_Attribute("UPDATES", NdbDictionary::Column::Unsigned)
  341. };
  342. const
  343. char* I3_Indexes[] = {
  344.   "UNIQUE", "ID", 0,
  345.   "ORDERED", "MAC", 0,
  346.   "ORDERED", "GW", 0,
  347.   0
  348. };
  349. static
  350. NDBT_Table I3("I3", sizeof(I3_Cols)/sizeof(NDBT_Attribute), I3_Cols
  351.       ); // ,I3_Indexes);
  352. // Define array with pointer to all tables 
  353. static
  354. const
  355. NDBT_Table *test_tables[]=
  356.   &T1,
  357.   &T2,
  358.   &T3,
  359.   &T4,
  360.   &T5,
  361.   &T6,
  362.   &T7,
  363.   &T8,
  364.   &T9,
  365.   &T10,
  366.   &T11,
  367.   &T12,
  368.   &T13,
  369.   &T14,
  370.   &I1,
  371.   &I2,
  372.   &I3
  373. };
  374. struct NDBT_IndexList {
  375.   const char * m_table;
  376.   const char ** m_indexes;
  377. };
  378. static
  379. const
  380. NDBT_IndexList indexes[] = {
  381.   "I1", I1_Indexes, 
  382.   "I2", I2_Indexes, 
  383.   "I3", I3_Indexes,
  384.   0, 0
  385. };
  386. static
  387. const
  388. int numTestTables = sizeof(test_tables)/sizeof(NDBT_Table*);
  389. /**
  390.  * Define tables we should not be able to create
  391.  */ 
  392. /* F1 
  393.  *
  394.  * Error: PK and column with same name
  395.  */
  396. static
  397. const
  398. NDBT_Attribute F1Attribs[] = {
  399.   NDBT_Attribute("KOL1", NdbDictionary::Column::Unsigned, 1, true), 
  400.   NDBT_Attribute("KOL3", NdbDictionary::Column::Unsigned),
  401.   NDBT_Attribute("KOL4", NdbDictionary::Column::Unsigned),
  402.   NDBT_Attribute("KOL5", NdbDictionary::Column::Unsigned),
  403.   NDBT_Attribute("KOL1", NdbDictionary::Column::Unsigned)
  404. };
  405. static
  406. const
  407. NDBT_Table F1("F1", sizeof(F1Attribs)/sizeof(NDBT_Attribute), F1Attribs);
  408. /* F2
  409.  *
  410.  * Error: Two columns with same name
  411.  */
  412. static
  413. const
  414. NDBT_Attribute F2Attribs[] = {
  415.   NDBT_Attribute("KOL1", NdbDictionary::Column::Unsigned, 1, true), 
  416.   NDBT_Attribute("KOL2", NdbDictionary::Column::Unsigned),
  417.   NDBT_Attribute("KOL2", NdbDictionary::Column::Unsigned),
  418.   NDBT_Attribute("KOL4", NdbDictionary::Column::Unsigned),
  419.   NDBT_Attribute("KOL5", NdbDictionary::Column::Unsigned)
  420. };
  421. static
  422. const
  423. NDBT_Table F2("F2", sizeof(F2Attribs)/sizeof(NDBT_Attribute), F2Attribs);
  424. /* F3
  425.  *
  426.  * Error: Too many primary keys defined, 32 is max
  427.  */
  428. static
  429. const
  430. NDBT_Attribute F3Attribs[] = {
  431.   NDBT_Attribute("KOL1", NdbDictionary::Column::Unsigned, 1, true), 
  432.   NDBT_Attribute("KOL2", NdbDictionary::Column::Unsigned, 1, true), 
  433.   NDBT_Attribute("KOL3", NdbDictionary::Column::Unsigned, 1, true), 
  434.   NDBT_Attribute("KOL4", NdbDictionary::Column::Unsigned, 1, true), 
  435.   NDBT_Attribute("KOL5", NdbDictionary::Column::Unsigned, 1, true), 
  436.   NDBT_Attribute("KOL6", NdbDictionary::Column::Unsigned, 1, true), 
  437.   NDBT_Attribute("KOL7", NdbDictionary::Column::Unsigned, 1, true), 
  438.   NDBT_Attribute("KOL8", NdbDictionary::Column::Unsigned, 1, true), 
  439.   NDBT_Attribute("KOL9", NdbDictionary::Column::Unsigned, 1, true), 
  440.   NDBT_Attribute("KOL10", NdbDictionary::Column::Unsigned, 1, true), 
  441.   NDBT_Attribute("KOL11", NdbDictionary::Column::Unsigned, 1, true), 
  442.   NDBT_Attribute("KOL12", NdbDictionary::Column::Unsigned, 1, true), 
  443.   NDBT_Attribute("KOL13", NdbDictionary::Column::Unsigned, 1, true), 
  444.   NDBT_Attribute("KOL14", NdbDictionary::Column::Unsigned, 1, true), 
  445.   NDBT_Attribute("KOL15", NdbDictionary::Column::Unsigned, 1, true), 
  446.   NDBT_Attribute("KOL16", NdbDictionary::Column::Unsigned, 1, true), 
  447.   NDBT_Attribute("KOL17", NdbDictionary::Column::Unsigned, 1, true), 
  448.   NDBT_Attribute("KOL18", NdbDictionary::Column::Unsigned, 1, true), 
  449.   NDBT_Attribute("KOL19", NdbDictionary::Column::Unsigned, 1, true), 
  450.   NDBT_Attribute("KOL20", NdbDictionary::Column::Unsigned, 1, true), 
  451.   NDBT_Attribute("KOL21", NdbDictionary::Column::Unsigned, 1, true), 
  452.   NDBT_Attribute("KOL22", NdbDictionary::Column::Unsigned, 1, true), 
  453.   NDBT_Attribute("KOL23", NdbDictionary::Column::Unsigned, 1, true), 
  454.   NDBT_Attribute("KOL24", NdbDictionary::Column::Unsigned, 1, true), 
  455.   NDBT_Attribute("KOL25", NdbDictionary::Column::Unsigned, 1, true), 
  456.   NDBT_Attribute("KOL26", NdbDictionary::Column::Unsigned, 1, true), 
  457.   NDBT_Attribute("KOL27", NdbDictionary::Column::Unsigned, 1, true), 
  458.   NDBT_Attribute("KOL28", NdbDictionary::Column::Unsigned, 1, true), 
  459.   NDBT_Attribute("KOL29", NdbDictionary::Column::Unsigned, 1, true), 
  460.   NDBT_Attribute("KOL30", NdbDictionary::Column::Unsigned, 1, true), 
  461.   NDBT_Attribute("KOL31", NdbDictionary::Column::Unsigned, 1, true), 
  462.   NDBT_Attribute("KOL32", NdbDictionary::Column::Unsigned, 1, true), 
  463.   NDBT_Attribute("KOL33", NdbDictionary::Column::Unsigned, 1, true), 
  464.   NDBT_Attribute("KOL40", NdbDictionary::Column::Unsigned),
  465.   NDBT_Attribute("KOL50", NdbDictionary::Column::Unsigned),
  466.   NDBT_Attribute("KOL60", NdbDictionary::Column::Unsigned),
  467.   NDBT_Attribute("KOL70", NdbDictionary::Column::Unsigned)
  468. };
  469. static
  470. const
  471. NDBT_Table F3("F3", sizeof(F3Attribs)/sizeof(NDBT_Attribute), F3Attribs);
  472. /* F4
  473.  *
  474.  * Error: Too long key
  475.  */
  476. static
  477. const
  478. NDBT_Attribute F4Attribs[] = {
  479.   NDBT_Attribute("KOL1", NdbDictionary::Column::Unsigned),
  480.   NDBT_Attribute("KOL2", NdbDictionary::Column::Unsigned, 9999999, true), 
  481.   NDBT_Attribute("KOL3", NdbDictionary::Column::Unsigned),
  482.   NDBT_Attribute("KOL4", NdbDictionary::Column::Unsigned),
  483.   NDBT_Attribute("KOL5", NdbDictionary::Column::Unsigned)
  484. };
  485. static
  486. const
  487. NDBT_Table F4("F4", sizeof(F4Attribs)/sizeof(NDBT_Attribute), F4Attribs);
  488. /* F5
  489.  *
  490.  * Error: Too long attr name
  491.  */
  492. static
  493. const
  494. NDBT_Attribute F5Attribs[] = {
  495.   NDBT_Attribute("KOL1WITHVERRYLONGNAME_ISITTOLONG", NdbDictionary::Column::Unsigned, true),
  496.   NDBT_Attribute("KOL3", NdbDictionary::Column::Unsigned),
  497.   NDBT_Attribute("KOL4", NdbDictionary::Column::Unsigned),
  498.   NDBT_Attribute("KOL5", NdbDictionary::Column::Unsigned)
  499. };
  500. static
  501. const
  502. NDBT_Table F5("F5", sizeof(F5Attribs)/sizeof(NDBT_Attribute), F5Attribs);
  503. /* F6
  504.  *
  505.  * Error: Zero length of pk attribute
  506.  */
  507. static
  508. const
  509. NDBT_Attribute F6Attribs[] = {
  510.   NDBT_Attribute("KOL1", NdbDictionary::Column::Char, 0, true, false), 
  511.   NDBT_Attribute("KOL2", NdbDictionary::Column::Char, 256),
  512. };
  513. static
  514. const
  515. NDBT_Table F6("F6", sizeof(F6Attribs)/sizeof(NDBT_Attribute), F6Attribs);
  516. /* F7
  517.  *
  518.  * Error: Table without primary key
  519.  */
  520. static
  521. const
  522. NDBT_Attribute F7Attribs[] = {
  523.   NDBT_Attribute("KOL3", NdbDictionary::Column::Unsigned),
  524.   NDBT_Attribute("KOL4", NdbDictionary::Column::Unsigned),
  525.   NDBT_Attribute("KOL5", NdbDictionary::Column::Unsigned)
  526. };
  527. NDBT_Table F7("F7", sizeof(F7Attribs)/sizeof(NDBT_Attribute), F7Attribs);
  528. /* F8
  529.  *
  530.  * Error: Table without nullable primary key
  531.  */
  532. static
  533. const
  534. NDBT_Attribute F8Attribs[] = {
  535.   NDBT_Attribute("KOL3", NdbDictionary::Column::Int, 1, true, true),
  536.   NDBT_Attribute("KOL4", NdbDictionary::Column::Int),
  537.   NDBT_Attribute("KOL5", NdbDictionary::Column::Int)
  538. };
  539. NDBT_Table F8("F8", sizeof(F8Attribs)/sizeof(NDBT_Attribute), F8Attribs);
  540. /* F15 - 2-node crash in v20x */
  541. static
  542. const
  543. NDBT_Attribute F15Attribs[] = {
  544.   NDBT_Attribute("KOL1", NdbDictionary::Column::Char, 40, true)
  545. };
  546. static
  547. const
  548. NDBT_Table F15("F15", sizeof(F15Attribs)/sizeof(NDBT_Attribute), F15Attribs);
  549. // Define array with pointer to tables that we should not  be able to create
  550. static
  551. const
  552. NDBT_Table *fail_tables[]=
  553.   &F1,
  554.   &F2,
  555.   &F3,
  556.   &F4,
  557.   &F5,
  558.   &F6,
  559.   &F7,
  560.   &F8,
  561.   &F15
  562. };
  563. static
  564. const
  565. int numFailTables = sizeof(fail_tables)/sizeof(NDBT_Table*);
  566. /**
  567.  * Define util tables that we may create
  568.  */ 
  569. /* GL 
  570.  * General ledger table for bank application
  571.  */
  572. static 
  573. const
  574. NDBT_Attribute GL_Attribs[] = {
  575.   NDBT_Attribute("TIME", NdbDictionary::Column::Bigunsigned, 1, true), 
  576.   NDBT_Attribute("ACCOUNT_TYPE", NdbDictionary::Column::Unsigned, 1, true), 
  577.   NDBT_Attribute("BALANCE", NdbDictionary::Column::Unsigned),
  578.   NDBT_Attribute("DEPOSIT_COUNT", NdbDictionary::Column::Unsigned),
  579.   NDBT_Attribute("DEPOSIT_SUM", NdbDictionary::Column::Unsigned),
  580.   NDBT_Attribute("WITHDRAWAL_COUNT", NdbDictionary::Column::Unsigned),
  581.   NDBT_Attribute("WITHDRAWAL_SUM", NdbDictionary::Column::Unsigned),
  582.   NDBT_Attribute("PURGED", NdbDictionary::Column::Unsigned)
  583. };
  584. static
  585. NDBT_Table GL("GL", sizeof(GL_Attribs)/sizeof(NDBT_Attribute), GL_Attribs);
  586. /* ACCOUNT
  587.  * Account table for bank application
  588.  */
  589. static 
  590. const
  591. NDBT_Attribute ACCOUNT_Attribs[] = {
  592.   NDBT_Attribute("ACCOUNT_ID", NdbDictionary::Column::Unsigned, 1, true), 
  593.   NDBT_Attribute("OWNER", NdbDictionary::Column::Unsigned),
  594.   NDBT_Attribute("BALANCE", NdbDictionary::Column::Unsigned),
  595.   NDBT_Attribute("ACCOUNT_TYPE", NdbDictionary::Column::Unsigned),
  596. };
  597. static
  598. NDBT_Table ACCOUNT("ACCOUNT", sizeof(ACCOUNT_Attribs)/sizeof(NDBT_Attribute), ACCOUNT_Attribs);
  599. /* TRANSACTION
  600.  * Transaction table for bank application
  601.  */
  602. static 
  603. const
  604. NDBT_Attribute TRANSACTION_Attribs[] = {
  605.   NDBT_Attribute("TRANSACTION_ID", NdbDictionary::Column::Bigunsigned, 1, true),
  606.   NDBT_Attribute("ACCOUNT", NdbDictionary::Column::Unsigned, 1, true), 
  607.   NDBT_Attribute("ACCOUNT_TYPE", NdbDictionary::Column::Unsigned), 
  608.   NDBT_Attribute("OTHER_ACCOUNT", NdbDictionary::Column::Unsigned),
  609.   NDBT_Attribute("TRANSACTION_TYPE", NdbDictionary::Column::Unsigned),
  610.   NDBT_Attribute("TIME", NdbDictionary::Column::Bigunsigned),
  611.   NDBT_Attribute("AMOUNT", NdbDictionary::Column::Unsigned),
  612. };
  613. static
  614. NDBT_Table TRANSACTION("TRANSACTION", sizeof(TRANSACTION_Attribs)/sizeof(NDBT_Attribute), TRANSACTION_Attribs);
  615. /* SYSTEM_VALUES
  616.  * System values table for bank application
  617.  */
  618. static 
  619. const
  620. NDBT_Attribute SYSTEM_VALUES_Attribs[] = {
  621.   NDBT_Attribute("SYSTEM_VALUES_ID", NdbDictionary::Column::Unsigned, 1, true),
  622.   NDBT_Attribute("VALUE", NdbDictionary::Column::Bigunsigned)
  623. };
  624. static
  625. NDBT_Table SYSTEM_VALUES("SYSTEM_VALUES", sizeof(SYSTEM_VALUES_Attribs)/sizeof(NDBT_Attribute), SYSTEM_VALUES_Attribs);
  626. /* ACCOUNT_TYPES
  627.  * Account types table for bank application
  628.  */
  629. static 
  630. const
  631. NDBT_Attribute ACCOUNT_TYPES_Attribs[] = {
  632.   NDBT_Attribute("ACCOUNT_TYPE_ID", NdbDictionary::Column::Unsigned, 1, true),
  633.   NDBT_Attribute("DESCRIPTION", NdbDictionary::Column::Char, 64)
  634. };
  635. static
  636. NDBT_Table ACCOUNT_TYPES("ACCOUNT_TYPE", sizeof(ACCOUNT_TYPES_Attribs)/sizeof(NDBT_Attribute), ACCOUNT_TYPES_Attribs);
  637. // Define array with pointer to util tables 
  638. static
  639. const
  640. NDBT_Table *util_tables[]=
  641.   &GL,
  642.   &ACCOUNT,
  643.   &TRANSACTION,
  644.   &SYSTEM_VALUES,
  645.   &ACCOUNT_TYPES
  646. };
  647. static
  648. const
  649. int numUtilTables = sizeof(util_tables)/sizeof(NDBT_Table*);
  650. const
  651. NdbDictionary::Table*
  652. NDBT_Tables::getTable(const char* _nam){
  653.   // Search tables list to find a table
  654.   NDBT_Table* tab = NULL;
  655.   int i;
  656.   for (i=0; i<numTestTables; i++){
  657.     if (strcmp(test_tables[i]->getName(), _nam) == 0){
  658.       return test_tables[i];
  659.     }
  660.   }
  661.   for (i=0; i<numFailTables; i++){
  662.     if (strcmp(fail_tables[i]->getName(), _nam) == 0){
  663.       return fail_tables[i];
  664.     }
  665.   }
  666.   for (i=0; i<numUtilTables; i++){
  667.     if (strcmp(util_tables[i]->getName(), _nam) == 0){
  668.       return util_tables[i];
  669.     }
  670.   }
  671.   // TPK_no tables
  672.   // Dynamcially create table vith primary key size
  673.   // set to no
  674.   // Useful for testing key sizes 1 - max
  675.   int pkSizeOfTable;
  676.   if(sscanf(_nam, "TPK_%d", &pkSizeOfTable) == 1){   
  677.     return tableWithPkSize(_nam, pkSizeOfTable);
  678.   }
  679.   return tab;
  680. }
  681. const NdbDictionary::Table*
  682. NDBT_Tables::tableWithPkSize(const char* _nam, Uint32 pkSize){
  683.   NdbDictionary::Table* tab = new NdbDictionary::Table(_nam);
  684.   // Add one PK of the desired length
  685.   tab->addColumn(NDBT_Attribute("PK1",
  686. NdbDictionary::Column::Char,
  687. pkSize,
  688. true));
  689.   
  690.   // Add 4 attributes
  691.   tab->addColumn(NDBT_Attribute("ATTR1",
  692. NdbDictionary::Column::Char,
  693. 21));
  694.   
  695.   tab->addColumn(NDBT_Attribute("ATTR2",
  696. NdbDictionary::Column::Char,
  697. 124));
  698.   
  699.   tab->addColumn(NDBT_Attribute("ATTR3",
  700. NdbDictionary::Column::Unsigned));
  701.   
  702.   tab->addColumn(NDBT_Attribute("ATTR4",
  703. NdbDictionary::Column::Unsigned));
  704.   
  705.   return tab;
  706. }
  707. const NdbDictionary::Table* 
  708. NDBT_Tables::getTable(int _num){
  709.   // Get table at pos _num
  710.   assert(_num < numTestTables);
  711.   return test_tables[_num];
  712. }
  713. int
  714. NDBT_Tables::getNumTables(){
  715.   return numTestTables;
  716. }
  717. int
  718. NDBT_Tables::createAllTables(Ndb* pNdb, bool _temp, bool existsOk){
  719.   
  720.   for (int i=0; i < NDBT_Tables::getNumTables(); i++){
  721.     pNdb->getDictionary()->dropTable(NDBT_Tables::getTable(i)->getName());
  722.     int ret= createTable(pNdb, 
  723.  NDBT_Tables::getTable(i)->getName(), _temp, existsOk);
  724.     if(ret){
  725.       return ret;
  726.     }
  727.   }
  728.   return NDBT_OK;
  729. }
  730. int
  731. NDBT_Tables::createAllTables(Ndb* pNdb){
  732.   return createAllTables(pNdb, false);
  733. }
  734. int
  735. NDBT_Tables::createTable(Ndb* pNdb, const char* _name, bool _temp, 
  736.  bool existsOk){
  737.   
  738.   const NdbDictionary::Table* tab = NDBT_Tables::getTable(_name);
  739.   if (tab == NULL){
  740.     ndbout << "Could not create table " << _name 
  741.    << ", it doesn't exist in list of tables "
  742.               "that NDBT_Tables can create!" << endl;
  743.     return NDBT_WRONGARGS;
  744.   }
  745.   int r = 0;
  746.   do {
  747.     NdbDictionary::Table tmpTab(* tab);
  748.     tmpTab.setStoredTable(_temp ? 0 : 1);
  749.   
  750.     r = pNdb->getDictionary()->createTable(tmpTab);
  751.     if(r == -1){
  752.       if(!existsOk){
  753. ndbout << "Error: " << pNdb->getDictionary()->getNdbError() << endl;
  754. break;
  755.       }
  756.       if(pNdb->getDictionary()->getNdbError().code != 721){
  757. ndbout << "Error: " << pNdb->getDictionary()->getNdbError() << endl;
  758. break;
  759.       }
  760.       r = 0;
  761.     }
  762.     
  763.     Uint32 i = 0;
  764.     for(i = 0; indexes[i].m_table != 0; i++){
  765.       if(strcmp(indexes[i].m_table, _name) != 0)
  766. continue;
  767.       Uint32 j = 0;
  768.       while(indexes[i].m_indexes[j] != 0){
  769. NdbDictionary::Index tmpIndx;
  770. BaseString name;
  771. name.assfmt("%s$NDBT_IDX%d", _name, j);
  772. tmpIndx.setName(name.c_str());
  773. tmpIndx.setTable(_name);
  774. bool logging = !_temp;
  775. if(strcmp(indexes[i].m_indexes[j], "ORDERED") == 0){
  776.   logging = false;
  777.   tmpIndx.setType(NdbDictionary::Index::OrderedIndex);
  778. } else if(strcmp(indexes[i].m_indexes[j], "UNIQUE") == 0){
  779.   tmpIndx.setType(NdbDictionary::Index::UniqueHashIndex);
  780. } else {
  781.   ndbout << "Unknown index type";
  782.   abort();
  783. }
  784. tmpIndx.setLogging(logging);
  785. j++;
  786. while(indexes[i].m_indexes[j] != 0){
  787.   tmpIndx.addIndexColumn(indexes[i].m_indexes[j]);
  788.   j++;
  789. }
  790. j++;
  791. if(pNdb->getDictionary()->createIndex(tmpIndx) != 0){
  792.   ndbout << pNdb->getDictionary()->getNdbError() << endl;
  793.   return NDBT_FAILED;
  794. }
  795.       }
  796.     }
  797.   } while(false);
  798.   
  799.   return r;
  800. }
  801. int
  802. NDBT_Tables::dropAllTables(Ndb* pNdb){
  803.   for (int i=0; i < NDBT_Tables::getNumTables(); i++){
  804.     const NdbDictionary::Table* tab = NDBT_Tables::getTable(i);
  805.     if (tab == NULL){
  806.       return NDBT_ProgramExit(NDBT_FAILED);
  807.     }
  808.     
  809.     if(pNdb->getDictionary()->dropTable(tab->getName()) == -1){
  810.       return NDBT_FAILED;
  811.     }
  812.   }
  813.   return NDBT_OK;
  814. }
  815. int
  816. NDBT_Tables::print(const char * _name){
  817.   
  818.   const NDBT_Table * tab = (const NDBT_Table*)NDBT_Tables::getTable(_name);
  819.   if (tab == NULL){
  820.     ndbout << "Could not print table " << _name 
  821.    << ", it doesn't exist in list of tables "
  822.    << "that NDBT_Tables can create!" << endl;
  823.     return NDBT_WRONGARGS;
  824.   }
  825.   ndbout << (* tab) << endl;
  826.   return NDBT_OK;
  827. }
  828. int
  829. NDBT_Tables::printAll(){
  830.   for (int i=0; i < getNumTables(); i++){
  831.     
  832.     const NdbDictionary::Table* tab = getTable(i);
  833.     if (tab == NULL){
  834.       abort();
  835.     }
  836.     ndbout << (* (NDBT_Table*)tab) << endl;
  837.   }
  838.   
  839.   return NDBT_OK;
  840. }