You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DatabaseTest.java 41KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317
  1. /*
  2. Copyright (c) 2007 Health Market Science, Inc.
  3. This library is free software; you can redistribute it and/or
  4. modify it under the terms of the GNU Lesser General Public
  5. License as published by the Free Software Foundation; either
  6. version 2.1 of the License, or (at your option) any later version.
  7. This library is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  10. Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public
  12. License along with this library; if not, write to the Free Software
  13. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  14. USA
  15. You can contact Health Market Science at info@healthmarketscience.com
  16. or at the following address:
  17. Health Market Science
  18. 2700 Horizon Drive
  19. Suite 200
  20. King of Prussia, PA 19406
  21. */
  22. package com.healthmarketscience.jackcess;
  23. import java.io.File;
  24. import java.io.FileInputStream;
  25. import java.io.FileNotFoundException;
  26. import java.io.FileOutputStream;
  27. import java.io.IOException;
  28. import java.io.InputStream;
  29. import java.io.OutputStream;
  30. import java.io.PrintWriter;
  31. import java.math.BigDecimal;
  32. import java.nio.ByteBuffer;
  33. import java.sql.Types;
  34. import java.text.DateFormat;
  35. import java.text.SimpleDateFormat;
  36. import java.util.ArrayList;
  37. import java.util.Arrays;
  38. import java.util.Calendar;
  39. import java.util.Collections;
  40. import java.util.Date;
  41. import java.util.HashSet;
  42. import java.util.Iterator;
  43. import java.util.LinkedHashMap;
  44. import java.util.List;
  45. import java.util.Map;
  46. import java.util.Set;
  47. import java.util.UUID;
  48. import junit.framework.TestCase;
  49. import static com.healthmarketscience.jackcess.Database.*;
  50. import static com.healthmarketscience.jackcess.JetFormatTest.*;
  51. /**
  52. * @author Tim McCune
  53. */
  54. public class DatabaseTest extends TestCase {
  55. static boolean _autoSync = Database.DEFAULT_AUTO_SYNC;
  56. public DatabaseTest(String name) throws Exception {
  57. super(name);
  58. }
  59. public static Database open(FileFormat fileFormat, File file)
  60. throws Exception
  61. {
  62. final Database db = Database.open(file, true, _autoSync);
  63. assertEquals("Wrong JetFormat.", fileFormat.getJetFormat(),
  64. db.getFormat());
  65. assertEquals("Wrong FileFormat.", fileFormat, db.getFileFormat());
  66. return db;
  67. }
  68. public static Database open(TestDB testDB) throws Exception {
  69. return open(testDB.getExpectedFileFormat(), testDB.getFile());
  70. }
  71. public static Database create(FileFormat fileFormat) throws Exception {
  72. return create(fileFormat, false);
  73. }
  74. public static Database create(FileFormat fileFormat, boolean keep)
  75. throws Exception
  76. {
  77. return Database.create(fileFormat, createTempFile(keep), _autoSync);
  78. }
  79. public static Database openCopy(TestDB testDB) throws Exception {
  80. return openCopy(testDB, false);
  81. }
  82. public static Database openCopy(TestDB testDB, boolean keep)
  83. throws Exception
  84. {
  85. return openCopy(testDB.getExpectedFileFormat(), testDB.getFile(), keep);
  86. }
  87. public static Database openCopy(FileFormat fileFormat, File file)
  88. throws Exception
  89. {
  90. return openCopy(fileFormat, file, false);
  91. }
  92. public static Database openCopy(FileFormat fileFormat, File file,
  93. boolean keep)
  94. throws Exception
  95. {
  96. File tmp = createTempFile(keep);
  97. copyFile(file, tmp);
  98. Database db = Database.open(tmp, false, _autoSync);
  99. assertEquals("Wrong JetFormat.", fileFormat.getJetFormat(),
  100. db.getFormat());
  101. assertEquals("Wrong FileFormat.", fileFormat, db.getFileFormat());
  102. return db;
  103. }
  104. public void testInvalidTableDefs() throws Exception {
  105. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  106. Database db = create(fileFormat);
  107. try {
  108. db.createTable("test", Collections.<Column>emptyList());
  109. fail("created table with no columns?");
  110. } catch(IllegalArgumentException e) {
  111. // success
  112. }
  113. try {
  114. new TableBuilder("test")
  115. .addColumn(new ColumnBuilder("A", DataType.TEXT))
  116. .addColumn(new ColumnBuilder("a", DataType.MEMO))
  117. .toTable(db);
  118. fail("created table with duplicate column names?");
  119. } catch(IllegalArgumentException e) {
  120. // success
  121. }
  122. try {
  123. new TableBuilder("test")
  124. .addColumn(new ColumnBuilder("A", DataType.TEXT)
  125. .setLengthInUnits(352))
  126. .toTable(db);
  127. fail("created table with invalid column length?");
  128. } catch(IllegalArgumentException e) {
  129. // success
  130. }
  131. try {
  132. new TableBuilder("test")
  133. .addColumn(new ColumnBuilder("A_" + createString(70), DataType.TEXT))
  134. .toTable(db);
  135. fail("created table with too long column name?");
  136. } catch(IllegalArgumentException e) {
  137. // success
  138. }
  139. new TableBuilder("test")
  140. .addColumn(new ColumnBuilder("A", DataType.TEXT))
  141. .toTable(db);
  142. try {
  143. new TableBuilder("Test")
  144. .addColumn(new ColumnBuilder("A", DataType.TEXT))
  145. .toTable(db);
  146. fail("create duplicate tables?");
  147. } catch(IllegalArgumentException e) {
  148. // success
  149. }
  150. }
  151. }
  152. public void testReadDeletedRows() throws Exception {
  153. for (final TestDB testDB : TestDB.getSupportedForBasename(Basename.DEL, true)) {
  154. Table table = open(testDB).getTable("Table");
  155. int rows = 0;
  156. while (table.getNextRow() != null) {
  157. rows++;
  158. }
  159. assertEquals(2, rows);
  160. }
  161. }
  162. public void testGetColumns() throws Exception {
  163. for (final TestDB testDB : SUPPORTED_DBS_TEST_FOR_READ) {
  164. List<Column> columns = open(testDB).getTable("Table1").getColumns();
  165. assertEquals(9, columns.size());
  166. checkColumn(columns, 0, "A", DataType.TEXT);
  167. checkColumn(columns, 1, "B", DataType.TEXT);
  168. checkColumn(columns, 2, "C", DataType.BYTE);
  169. checkColumn(columns, 3, "D", DataType.INT);
  170. checkColumn(columns, 4, "E", DataType.LONG);
  171. checkColumn(columns, 5, "F", DataType.DOUBLE);
  172. checkColumn(columns, 6, "G", DataType.SHORT_DATE_TIME);
  173. checkColumn(columns, 7, "H", DataType.MONEY);
  174. checkColumn(columns, 8, "I", DataType.BOOLEAN);
  175. }
  176. }
  177. static void checkColumn(List<Column> columns, int columnNumber, String name,
  178. DataType dataType)
  179. throws Exception
  180. {
  181. Column column = columns.get(columnNumber);
  182. assertEquals(name, column.getName());
  183. assertEquals(dataType, column.getType());
  184. }
  185. public void testGetNextRow() throws Exception {
  186. for (final TestDB testDB : SUPPORTED_DBS_TEST_FOR_READ) {
  187. final Database db = open(testDB);
  188. assertEquals(4, db.getTableNames().size());
  189. final Table table = db.getTable("Table1");
  190. Map<String, Object> row1 = table.getNextRow();
  191. Map<String, Object> row2 = table.getNextRow();
  192. if(!"abcdefg".equals(row1.get("A"))) {
  193. Map<String, Object> tmpRow = row1;
  194. row1 = row2;
  195. row2 = tmpRow;
  196. }
  197. checkTestDBTable1RowABCDEFG(testDB, table, row1);
  198. checkTestDBTable1RowA(testDB, table, row2);
  199. }
  200. }
  201. static void checkTestDBTable1RowABCDEFG(final TestDB testDB, final Table table, final Map<String, Object> row)
  202. throws IOException {
  203. assertEquals("testDB: " + testDB + "; table: " + table, "abcdefg", row.get("A"));
  204. assertEquals("hijklmnop", row.get("B"));
  205. assertEquals(new Byte((byte) 2), row.get("C"));
  206. assertEquals(new Short((short) 222), row.get("D"));
  207. assertEquals(new Integer(333333333), row.get("E"));
  208. assertEquals(new Double(444.555d), row.get("F"));
  209. final Calendar cal = Calendar.getInstance();
  210. cal.setTime((Date) row.get("G"));
  211. assertEquals(Calendar.SEPTEMBER, cal.get(Calendar.MONTH));
  212. assertEquals(21, cal.get(Calendar.DAY_OF_MONTH));
  213. assertEquals(1974, cal.get(Calendar.YEAR));
  214. assertEquals(0, cal.get(Calendar.HOUR_OF_DAY));
  215. assertEquals(0, cal.get(Calendar.MINUTE));
  216. assertEquals(0, cal.get(Calendar.SECOND));
  217. assertEquals(0, cal.get(Calendar.MILLISECOND));
  218. assertEquals(Boolean.TRUE, row.get("I"));
  219. }
  220. static void checkTestDBTable1RowA(final TestDB testDB, final Table table, final Map<String, Object> row)
  221. throws IOException {
  222. assertEquals("testDB: " + testDB + "; table: " + table, "a", row.get("A"));
  223. assertEquals("b", row.get("B"));
  224. assertEquals(new Byte((byte) 0), row.get("C"));
  225. assertEquals(new Short((short) 0), row.get("D"));
  226. assertEquals(new Integer(0), row.get("E"));
  227. assertEquals(new Double(0d), row.get("F"));
  228. final Calendar cal = Calendar.getInstance();
  229. cal.setTime((Date) row.get("G"));
  230. assertEquals(Calendar.DECEMBER, cal.get(Calendar.MONTH));
  231. assertEquals(12, cal.get(Calendar.DAY_OF_MONTH));
  232. assertEquals(1981, cal.get(Calendar.YEAR));
  233. assertEquals(0, cal.get(Calendar.HOUR_OF_DAY));
  234. assertEquals(0, cal.get(Calendar.MINUTE));
  235. assertEquals(0, cal.get(Calendar.SECOND));
  236. assertEquals(0, cal.get(Calendar.MILLISECOND));
  237. assertEquals(Boolean.FALSE, row.get("I"));
  238. }
  239. public void testCreate() throws Exception {
  240. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  241. Database db = create(fileFormat);
  242. assertEquals(0, db.getTableNames().size());
  243. }
  244. }
  245. public void testWriteAndRead() throws Exception {
  246. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  247. Database db = create(fileFormat);
  248. createTestTable(db);
  249. Object[] row = createTestRow();
  250. row[3] = null;
  251. Table table = db.getTable("Test");
  252. int count = 1000;
  253. for (int i = 0; i < count; i++) {
  254. table.addRow(row);
  255. }
  256. for (int i = 0; i < count; i++) {
  257. Map<String, Object> readRow = table.getNextRow();
  258. assertEquals(row[0], readRow.get("A"));
  259. assertEquals(row[1], readRow.get("B"));
  260. assertEquals(row[2], readRow.get("C"));
  261. assertEquals(row[3], readRow.get("D"));
  262. assertEquals(row[4], readRow.get("E"));
  263. assertEquals(row[5], readRow.get("F"));
  264. assertEquals(row[6], readRow.get("G"));
  265. assertEquals(row[7], readRow.get("H"));
  266. }
  267. }
  268. }
  269. public void testWriteAndReadInBatch() throws Exception {
  270. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  271. Database db = create(fileFormat);
  272. createTestTable(db);
  273. int count = 1000;
  274. List<Object[]> rows = new ArrayList<Object[]>(count);
  275. Object[] row = createTestRow();
  276. for (int i = 0; i < count; i++) {
  277. rows.add(row);
  278. }
  279. Table table = db.getTable("Test");
  280. table.addRows(rows);
  281. for (int i = 0; i < count; i++) {
  282. Map<String, Object> readRow = table.getNextRow();
  283. assertEquals(row[0], readRow.get("A"));
  284. assertEquals(row[1], readRow.get("B"));
  285. assertEquals(row[2], readRow.get("C"));
  286. assertEquals(row[3], readRow.get("D"));
  287. assertEquals(row[4], readRow.get("E"));
  288. assertEquals(row[5], readRow.get("F"));
  289. assertEquals(row[6], readRow.get("G"));
  290. assertEquals(row[7], readRow.get("H"));
  291. }
  292. }
  293. }
  294. public void testDeleteCurrentRow() throws Exception {
  295. // make sure correct row is deleted
  296. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  297. Database db = create(fileFormat);
  298. createTestTable(db);
  299. Object[] row1 = createTestRow("Tim1");
  300. Object[] row2 = createTestRow("Tim2");
  301. Object[] row3 = createTestRow("Tim3");
  302. Table table = db.getTable("Test");
  303. table.addRows(Arrays.asList(row1, row2, row3));
  304. assertRowCount(3, table);
  305. table.reset();
  306. table.getNextRow();
  307. table.getNextRow();
  308. table.deleteCurrentRow();
  309. table.reset();
  310. Map<String, Object> outRow = table.getNextRow();
  311. assertEquals("Tim1", outRow.get("A"));
  312. outRow = table.getNextRow();
  313. assertEquals("Tim3", outRow.get("A"));
  314. assertRowCount(2, table);
  315. // test multi row delete/add
  316. db = create(fileFormat);
  317. createTestTable(db);
  318. Object[] row = createTestRow();
  319. table = db.getTable("Test");
  320. for (int i = 0; i < 10; i++) {
  321. row[3] = i;
  322. table.addRow(row);
  323. }
  324. row[3] = 1974;
  325. assertRowCount(10, table);
  326. table.reset();
  327. table.getNextRow();
  328. table.deleteCurrentRow();
  329. assertRowCount(9, table);
  330. table.reset();
  331. table.getNextRow();
  332. table.deleteCurrentRow();
  333. assertRowCount(8, table);
  334. table.reset();
  335. for (int i = 0; i < 8; i++) {
  336. table.getNextRow();
  337. }
  338. table.deleteCurrentRow();
  339. assertRowCount(7, table);
  340. table.addRow(row);
  341. assertRowCount(8, table);
  342. table.reset();
  343. for (int i = 0; i < 3; i++) {
  344. table.getNextRow();
  345. }
  346. table.deleteCurrentRow();
  347. assertRowCount(7, table);
  348. table.reset();
  349. assertEquals(2, table.getNextRow().get("D"));
  350. }
  351. }
  352. public void testReadLongValue() throws Exception {
  353. for (final TestDB testDB : TestDB.getSupportedForBasename(Basename.TEST2, true)) {
  354. Database db = open(testDB);
  355. Table table = db.getTable("MSP_PROJECTS");
  356. Map<String, Object> row = table.getNextRow();
  357. assertEquals("Jon Iles this is a a vawesrasoih aksdkl fas dlkjflkasjd flkjaslkdjflkajlksj dfl lkasjdf lkjaskldfj lkas dlk lkjsjdfkl; aslkdf lkasjkldjf lka skldf lka sdkjfl;kasjd falksjdfljaslkdjf laskjdfk jalskjd flkj aslkdjflkjkjasljdflkjas jf;lkasjd fjkas dasdf asd fasdf asdf asdmhf lksaiyudfoi jasodfj902384jsdf9 aw90se fisajldkfj lkasj dlkfslkd jflksjadf as", row.get("PROJ_PROP_AUTHOR"));
  358. assertEquals("T", row.get("PROJ_PROP_COMPANY"));
  359. assertEquals("Standard", row.get("PROJ_INFO_CAL_NAME"));
  360. assertEquals("Project1", row.get("PROJ_PROP_TITLE"));
  361. byte[] foundBinaryData = (byte[])row.get("RESERVED_BINARY_DATA");
  362. byte[] expectedBinaryData =
  363. toByteArray(new File("test/data/test2BinData.dat"));
  364. assertTrue(Arrays.equals(expectedBinaryData, foundBinaryData));
  365. }
  366. }
  367. public void testWriteLongValue() throws Exception {
  368. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  369. Database db = create(fileFormat);
  370. Table table =
  371. new TableBuilder("test")
  372. .addColumn(new ColumnBuilder("A", DataType.TEXT))
  373. .addColumn(new ColumnBuilder("B", DataType.MEMO))
  374. .addColumn(new ColumnBuilder("C", DataType.OLE))
  375. .toTable(db);
  376. String testStr = "This is a test";
  377. String longMemo = createString(2030);
  378. byte[] oleValue = toByteArray(new File("test/data/test2BinData.dat"));
  379. table.addRow(testStr, testStr, null);
  380. table.addRow(testStr, longMemo, oleValue);
  381. table.reset();
  382. Map<String, Object> row = table.getNextRow();
  383. assertEquals(testStr, row.get("A"));
  384. assertEquals(testStr, row.get("B"));
  385. assertNull(row.get("C"));
  386. row = table.getNextRow();
  387. assertEquals(testStr, row.get("A"));
  388. assertEquals(longMemo, row.get("B"));
  389. assertTrue(Arrays.equals(oleValue, (byte[])row.get("C")));
  390. }
  391. }
  392. public void testManyMemos() throws Exception {
  393. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  394. Database db = create(fileFormat);
  395. final int numColumns = 126;
  396. TableBuilder bigTableBuilder = new TableBuilder("test");
  397. for (int i = 0; i < numColumns; i++)
  398. {
  399. bigTableBuilder.addColumn(new ColumnBuilder("column_" + i, DataType.MEMO));
  400. }
  401. Table bigTable = bigTableBuilder.toTable(db);
  402. List<Object[]> expectedRows = new ArrayList<Object[]>();
  403. for (int j = 0; j < 3; j++)
  404. {
  405. Object[] rowData = new String[numColumns];
  406. for (int i = 0; i < numColumns; i++)
  407. {
  408. rowData[i] = "v_" + i + ";" + (j + 999);
  409. }
  410. expectedRows.add(rowData);
  411. bigTable.addRow(rowData);
  412. }
  413. String extra1 = createString(100);
  414. String extra2 = createString(2050);
  415. for (int j = 0; j < 1; j++)
  416. {
  417. Object[] rowData = new String[numColumns];
  418. for (int i = 0; i < numColumns; i++)
  419. {
  420. rowData[i] = "v_" + i + ";" + (j + 999) + extra2;
  421. }
  422. expectedRows.add(rowData);
  423. bigTable.addRow(rowData);
  424. }
  425. for (int j = 0; j < 2; j++)
  426. {
  427. Object[] rowData = new String[numColumns];
  428. for (int i = 0; i < numColumns; i++)
  429. {
  430. String tmp = "v_" + i + ";" + (j + 999);
  431. if((i % 3) == 0) {
  432. tmp += extra1;
  433. } else if((i % 7) == 0) {
  434. tmp += extra2;
  435. }
  436. rowData[i] = tmp;
  437. }
  438. expectedRows.add(rowData);
  439. bigTable.addRow(rowData);
  440. }
  441. bigTable.reset();
  442. Iterator<Object[]> expIter = expectedRows.iterator();
  443. for(Map<?,?> row : bigTable) {
  444. Object[] expectedRow = expIter.next();
  445. assertEquals(Arrays.asList(expectedRow),
  446. new ArrayList<Object>(row.values()));
  447. }
  448. db.close();
  449. }
  450. }
  451. public void testMissingFile() throws Exception {
  452. File bogusFile = new File("fooby-dooby.mdb");
  453. assertTrue(!bogusFile.exists());
  454. try {
  455. Database.open(bogusFile, true, _autoSync);
  456. fail("FileNotFoundException should have been thrown");
  457. } catch(FileNotFoundException e) {
  458. }
  459. assertTrue(!bogusFile.exists());
  460. }
  461. public void testReadWithDeletedCols() throws Exception {
  462. for (final TestDB testDB : TestDB.getSupportedForBasename(Basename.DEL_COL, true)) {
  463. Table table = open(testDB).getTable("Table1");
  464. Map<String, Object> expectedRow0 = new LinkedHashMap<String, Object>();
  465. expectedRow0.put("id", 0);
  466. expectedRow0.put("id2", 2);
  467. expectedRow0.put("data", "foo");
  468. expectedRow0.put("data2", "foo2");
  469. Map<String, Object> expectedRow1 = new LinkedHashMap<String, Object>();
  470. expectedRow1.put("id", 3);
  471. expectedRow1.put("id2", 5);
  472. expectedRow1.put("data", "bar");
  473. expectedRow1.put("data2", "bar2");
  474. int rowNum = 0;
  475. Map<String, Object> row = null;
  476. while ((row = table.getNextRow()) != null) {
  477. if(rowNum == 0) {
  478. assertEquals(expectedRow0, row);
  479. } else if(rowNum == 1) {
  480. assertEquals(expectedRow1, row);
  481. } else if(rowNum >= 2) {
  482. fail("should only have 2 rows");
  483. }
  484. rowNum++;
  485. }
  486. }
  487. }
  488. public void testCurrency() throws Exception {
  489. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  490. Database db = create(fileFormat);
  491. Table table = new TableBuilder("test")
  492. .addColumn(new ColumnBuilder("A", DataType.MONEY))
  493. .toTable(db);
  494. table.addRow(new BigDecimal("-2341234.03450"));
  495. table.addRow(37L);
  496. table.addRow("10000.45");
  497. table.reset();
  498. List<Object> foundValues = new ArrayList<Object>();
  499. Map<String, Object> row = null;
  500. while((row = table.getNextRow()) != null) {
  501. foundValues.add(row.get("A"));
  502. }
  503. assertEquals(Arrays.asList(
  504. new BigDecimal("-2341234.0345"),
  505. new BigDecimal("37.0000"),
  506. new BigDecimal("10000.4500")),
  507. foundValues);
  508. try {
  509. table.addRow(new BigDecimal("342523234145343543.3453"));
  510. fail("IOException should have been thrown");
  511. } catch(IOException e) {
  512. // ignored
  513. }
  514. }
  515. }
  516. public void testGUID() throws Exception
  517. {
  518. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  519. Database db = create(fileFormat);
  520. Table table = new TableBuilder("test")
  521. .addColumn(new ColumnBuilder("A", DataType.GUID))
  522. .toTable(db);
  523. table.addRow("{32A59F01-AA34-3E29-453F-4523453CD2E6}");
  524. table.addRow("{32a59f01-aa34-3e29-453f-4523453cd2e6}");
  525. table.addRow("{11111111-1111-1111-1111-111111111111}");
  526. table.addRow(" {FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF} ");
  527. table.addRow(UUID.fromString("32a59f01-1234-3e29-4aaf-4523453cd2e6"));
  528. table.reset();
  529. List<Object> foundValues = new ArrayList<Object>();
  530. Map<String, Object> row = null;
  531. while((row = table.getNextRow()) != null) {
  532. foundValues.add(row.get("A"));
  533. }
  534. assertEquals(Arrays.asList(
  535. "{32A59F01-AA34-3E29-453F-4523453CD2E6}",
  536. "{32A59F01-AA34-3E29-453F-4523453CD2E6}",
  537. "{11111111-1111-1111-1111-111111111111}",
  538. "{FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF}",
  539. "{32A59F01-1234-3E29-4AAF-4523453CD2E6}"),
  540. foundValues);
  541. try {
  542. table.addRow("3245234");
  543. fail("IOException should have been thrown");
  544. } catch(IOException e) {
  545. // ignored
  546. }
  547. }
  548. }
  549. public void testNumeric() throws Exception
  550. {
  551. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  552. Database db = create(fileFormat);
  553. Column col = new ColumnBuilder("A", DataType.NUMERIC)
  554. .setScale(4).setPrecision(8).toColumn();
  555. assertTrue(col.isVariableLength());
  556. Table table = new TableBuilder("test")
  557. .addColumn(col)
  558. .addColumn(new ColumnBuilder("B", DataType.NUMERIC)
  559. .setScale(8).setPrecision(28))
  560. .toTable(db);
  561. table.addRow(new BigDecimal("-1234.03450"),
  562. new BigDecimal("23923434453436.36234219"));
  563. table.addRow(37L, 37L);
  564. table.addRow("1000.45", "-3452345321000");
  565. table.reset();
  566. List<Object> foundSmallValues = new ArrayList<Object>();
  567. List<Object> foundBigValues = new ArrayList<Object>();
  568. Map<String, Object> row = null;
  569. while((row = table.getNextRow()) != null) {
  570. foundSmallValues.add(row.get("A"));
  571. foundBigValues.add(row.get("B"));
  572. }
  573. assertEquals(Arrays.asList(
  574. new BigDecimal("-1234.0345"),
  575. new BigDecimal("37.0000"),
  576. new BigDecimal("1000.4500")),
  577. foundSmallValues);
  578. assertEquals(Arrays.asList(
  579. new BigDecimal("23923434453436.36234219"),
  580. new BigDecimal("37.00000000"),
  581. new BigDecimal("-3452345321000.00000000")),
  582. foundBigValues);
  583. try {
  584. table.addRow(new BigDecimal("3245234.234"),
  585. new BigDecimal("3245234.234"));
  586. fail("IOException should have been thrown");
  587. } catch(IOException e) {
  588. // ignored
  589. }
  590. }
  591. }
  592. public void testFixedNumeric() throws Exception
  593. {
  594. for (final TestDB testDB : TestDB.getSupportedForBasename(Basename.FIXED_NUMERIC)) {
  595. Database db = openCopy(testDB);
  596. Table t = db.getTable("test");
  597. boolean first = true;
  598. for(Column col : t.getColumns()) {
  599. if(first) {
  600. assertTrue(col.isVariableLength());
  601. assertEquals(DataType.MEMO, col.getType());
  602. first = false;
  603. } else {
  604. assertFalse(col.isVariableLength());
  605. assertEquals(DataType.NUMERIC, col.getType());
  606. }
  607. }
  608. Map<String, Object> row = t.getNextRow();
  609. assertEquals("some data", row.get("col1"));
  610. assertEquals(new BigDecimal("1"), row.get("col2"));
  611. assertEquals(new BigDecimal("0"), row.get("col3"));
  612. assertEquals(new BigDecimal("0"), row.get("col4"));
  613. assertEquals(new BigDecimal("4"), row.get("col5"));
  614. assertEquals(new BigDecimal("-1"), row.get("col6"));
  615. assertEquals(new BigDecimal("1"), row.get("col7"));
  616. Object[] tmpRow = new Object[]{
  617. "foo", new BigDecimal("1"), new BigDecimal(3), new BigDecimal("13"),
  618. new BigDecimal("-17"), new BigDecimal("0"), new BigDecimal("8734")};
  619. t.addRow(tmpRow);
  620. t.reset();
  621. t.getNextRow();
  622. row = t.getNextRow();
  623. assertEquals(tmpRow[0], row.get("col1"));
  624. assertEquals(tmpRow[1], row.get("col2"));
  625. assertEquals(tmpRow[2], row.get("col3"));
  626. assertEquals(tmpRow[3], row.get("col4"));
  627. assertEquals(tmpRow[4], row.get("col5"));
  628. assertEquals(tmpRow[5], row.get("col6"));
  629. assertEquals(tmpRow[6], row.get("col7"));
  630. db.close();
  631. }
  632. }
  633. public void testMultiPageTableDef() throws Exception
  634. {
  635. for (final TestDB testDB : SUPPORTED_DBS_TEST_FOR_READ) {
  636. List<Column> columns = open(testDB).getTable("Table2").getColumns();
  637. assertEquals(89, columns.size());
  638. }
  639. }
  640. public void testOverflow() throws Exception
  641. {
  642. for (final TestDB testDB : TestDB.getSupportedForBasename(Basename.OVERFLOW, true)) {
  643. Database mdb = open(testDB);
  644. Table table = mdb.getTable("Table1");
  645. // 7 rows, 3 and 5 are overflow
  646. table.getNextRow();
  647. table.getNextRow();
  648. Map<String, Object> row = table.getNextRow();
  649. assertEquals(Arrays.<Object>asList(
  650. null, "row3col3", null, null, null, null, null,
  651. "row3col9", null),
  652. new ArrayList<Object>(row.values()));
  653. table.getNextRow();
  654. row = table.getNextRow();
  655. assertEquals(Arrays.<Object>asList(
  656. null, "row5col2", null, null, null, null, null, null,
  657. null),
  658. new ArrayList<Object>(row.values()));
  659. table.reset();
  660. assertRowCount(7, table);
  661. }
  662. }
  663. public void testLongValueAsMiddleColumn() throws Exception
  664. {
  665. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  666. Database db = create(fileFormat);
  667. Table newTable = new TableBuilder("NewTable")
  668. .addColumn(new ColumnBuilder("a").setSQLType(Types.INTEGER))
  669. .addColumn(new ColumnBuilder("b").setSQLType(Types.LONGVARCHAR))
  670. .addColumn(new ColumnBuilder("c").setSQLType(Types.VARCHAR))
  671. .toTable(db);
  672. String lval = createString(2000); // "--2000 chars long text--";
  673. String tval = createString(40); // "--40chars long text--";
  674. newTable.addRow(new Integer(1), lval, tval);
  675. newTable = db.getTable("NewTable");
  676. Map<String, Object> readRow = newTable.getNextRow();
  677. assertEquals(new Integer(1), readRow.get("a"));
  678. assertEquals(lval, readRow.get("b"));
  679. assertEquals(tval, readRow.get("c"));
  680. }
  681. }
  682. public void testUsageMapPromotion() throws Exception {
  683. for (final TestDB testDB : TestDB.getSupportedForBasename(Basename.PROMOTION)) {
  684. Database db = openCopy(testDB);
  685. Table t = db.getTable("jobDB1");
  686. assertTrue(t.getOwnedPagesCursor().getUsageMap().toString()
  687. .startsWith("(InlineHandler)"));
  688. String lval = createNonAsciiString(255); // "--255 chars long text--";
  689. for(int i = 0; i < 1000; ++i) {
  690. t.addRow(i, 13, 57, lval, lval, lval, lval, lval, lval, 47.0d);
  691. }
  692. Set<Integer> ids = new HashSet<Integer>();
  693. for(Map<String,Object> row : t) {
  694. ids.add((Integer)row.get("ID"));
  695. }
  696. assertEquals(1000, ids.size());
  697. assertTrue(t.getOwnedPagesCursor().getUsageMap().toString()
  698. .startsWith("(ReferenceHandler)"));
  699. db.close();
  700. }
  701. }
  702. public void testLargeTableDef() throws Exception {
  703. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  704. Database db = create(fileFormat);
  705. final int numColumns = 90;
  706. List<Column> columns = new ArrayList<Column>();
  707. List<String> colNames = new ArrayList<String>();
  708. for(int i = 0; i < numColumns; ++i) {
  709. String colName = "MyColumnName" + i;
  710. colNames.add(colName);
  711. columns.add(new ColumnBuilder(colName, DataType.TEXT).toColumn());
  712. }
  713. db.createTable("test", columns);
  714. Table t = db.getTable("test");
  715. List<String> row = new ArrayList<String>();
  716. Map<String,Object> expectedRowData = new LinkedHashMap<String, Object>();
  717. for(int i = 0; i < numColumns; ++i) {
  718. String value = "" + i + " some row data";
  719. row.add(value);
  720. expectedRowData.put(colNames.get(i), value);
  721. }
  722. t.addRow(row.toArray());
  723. t.reset();
  724. assertEquals(expectedRowData, t.getNextRow());
  725. db.close();
  726. }
  727. }
  728. public void testAutoNumber() throws Exception {
  729. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  730. Database db = create(fileFormat);
  731. Table table = new TableBuilder("test")
  732. .addColumn(new ColumnBuilder("a", DataType.LONG)
  733. .setAutoNumber(true))
  734. .addColumn(new ColumnBuilder("b", DataType.TEXT))
  735. .toTable(db);
  736. doTestAutoNumber(table);
  737. db.close();
  738. }
  739. }
  740. public void testAutoNumberPK() throws Exception {
  741. for (final TestDB testDB : SUPPORTED_DBS_TEST) {
  742. Database db = openCopy(testDB);
  743. Table table = db.getTable("Table3");
  744. doTestAutoNumber(table);
  745. db.close();
  746. }
  747. }
  748. private void doTestAutoNumber(Table table) throws Exception
  749. {
  750. table.addRow(null, "row1");
  751. table.addRow(13, "row2");
  752. table.addRow("flubber", "row3");
  753. table.reset();
  754. table.addRow(Column.AUTO_NUMBER, "row4");
  755. table.addRow(Column.AUTO_NUMBER, "row5");
  756. table.reset();
  757. List<Map<String, Object>> expectedRows =
  758. createExpectedTable(
  759. createExpectedRow(
  760. "a", 1,
  761. "b", "row1"),
  762. createExpectedRow(
  763. "a", 2,
  764. "b", "row2"),
  765. createExpectedRow(
  766. "a", 3,
  767. "b", "row3"),
  768. createExpectedRow(
  769. "a", 4,
  770. "b", "row4"),
  771. createExpectedRow(
  772. "a", 5,
  773. "b", "row5"));
  774. assertTable(expectedRows, table);
  775. }
  776. public void testWriteAndReadDate() throws Exception {
  777. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  778. Database db = create(fileFormat);
  779. Table table = new TableBuilder("test")
  780. .addColumn(new ColumnBuilder("name", DataType.TEXT))
  781. .addColumn(new ColumnBuilder("date", DataType.SHORT_DATE_TIME))
  782. .toTable(db);
  783. // since jackcess does not really store millis, shave them off before
  784. // storing the current date/time
  785. long curTimeNoMillis = (System.currentTimeMillis() / 1000L);
  786. curTimeNoMillis *= 1000L;
  787. DateFormat df = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
  788. List<Date> dates =
  789. new ArrayList<Date>(
  790. Arrays.asList(
  791. df.parse("19801231 00:00:00"),
  792. df.parse("19930513 14:43:27"),
  793. null,
  794. df.parse("20210102 02:37:00"),
  795. new Date(curTimeNoMillis)));
  796. Calendar c = Calendar.getInstance();
  797. for(int year = 1801; year < 2050; year +=3) {
  798. for(int month = 0; month <= 12; ++month) {
  799. for(int day = 1; day < 29; day += 3) {
  800. c.clear();
  801. c.set(Calendar.YEAR, year);
  802. c.set(Calendar.MONTH, month);
  803. c.set(Calendar.DAY_OF_MONTH, day);
  804. dates.add(c.getTime());
  805. }
  806. }
  807. }
  808. for(Date d : dates) {
  809. table.addRow("row " + d, d);
  810. }
  811. List<Date> foundDates = new ArrayList<Date>();
  812. for(Map<String,Object> row : table) {
  813. foundDates.add((Date)row.get("date"));
  814. }
  815. assertEquals(dates.size(), foundDates.size());
  816. for(int i = 0; i < dates.size(); ++i) {
  817. Date expected = dates.get(i);
  818. Date found = foundDates.get(i);
  819. if(expected == null) {
  820. assertNull(found);
  821. } else {
  822. // there are some rounding issues due to dates being stored as
  823. // doubles, but it results in a 1 millisecond difference, so i'm not
  824. // going to worry about it
  825. long expTime = expected.getTime();
  826. long foundTime = found.getTime();
  827. try {
  828. assertTrue((expTime == foundTime) ||
  829. (Math.abs(expTime - foundTime) <= 1));
  830. } catch(Error e) {
  831. System.err.println("Expected " + expTime + ", found " + foundTime);
  832. throw e;
  833. }
  834. }
  835. }
  836. }
  837. }
  838. public void testSystemTable() throws Exception
  839. {
  840. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  841. Database db = create(fileFormat);
  842. if (!FileFormat.V2003.equals(fileFormat)
  843. && !FileFormat.V2007.equals(fileFormat)) {
  844. assertNotNull("file format: " + fileFormat, db.getSystemTable("MSysAccessObjects"));
  845. } else {
  846. // v2003, v2007 template files have no "MSysAccessObjects" table
  847. assertNull("file format: " + fileFormat, db.getSystemTable("MSysAccessObjects"));
  848. }
  849. assertNotNull(db.getSystemTable("MSysObjects"));
  850. assertNotNull(db.getSystemTable("MSysQueries"));
  851. assertNotNull(db.getSystemTable("MSysACES"));
  852. assertNotNull(db.getSystemTable("MSysRelationships"));
  853. assertNull(db.getSystemTable("MSysBogus"));
  854. db.close();
  855. }
  856. }
  857. public void testUpdateRow() throws Exception
  858. {
  859. for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) {
  860. Database db = create(fileFormat);
  861. Table t = new TableBuilder("test")
  862. .addColumn(new ColumnBuilder("name", DataType.TEXT))
  863. .addColumn(new ColumnBuilder("id", DataType.LONG)
  864. .setAutoNumber(true))
  865. .addColumn(new ColumnBuilder("data", DataType.TEXT)
  866. .setLength(JetFormat.TEXT_FIELD_MAX_LENGTH))
  867. .toTable(db);
  868. for(int i = 0; i < 10; ++i) {
  869. t.addRow("row" + i, Column.AUTO_NUMBER, "initial data");
  870. }
  871. Cursor c = Cursor.createCursor(t);
  872. c.reset();
  873. c.moveNextRows(2);
  874. Map<String,Object> row = c.getCurrentRow();
  875. assertEquals(createExpectedRow("name", "row1",
  876. "id", 2,
  877. "data", "initial data"),
  878. row);
  879. c.updateCurrentRow(Column.KEEP_VALUE, Column.AUTO_NUMBER, "new data");
  880. c.moveNextRows(3);
  881. row = c.getCurrentRow();
  882. assertEquals(createExpectedRow("name", "row4",
  883. "id", 5,
  884. "data", "initial data"),
  885. row);
  886. c.updateCurrentRow(Column.KEEP_VALUE, Column.AUTO_NUMBER, "a larger amount of new data");
  887. c.reset();
  888. c.moveNextRows(2);
  889. row = c.getCurrentRow();
  890. assertEquals(createExpectedRow("name", "row1",
  891. "id", 2,
  892. "data", "new data"),
  893. row);
  894. c.moveNextRows(3);
  895. row = c.getCurrentRow();
  896. assertEquals(createExpectedRow("name", "row4",
  897. "id", 5,
  898. "data", "a larger amount of new data"),
  899. row);
  900. t.reset();
  901. String str = createString(100);
  902. for(int i = 10; i < 50; ++i) {
  903. t.addRow("row" + i, Column.AUTO_NUMBER, "big data_" + str);
  904. }
  905. c.reset();
  906. c.moveNextRows(9);
  907. row = c.getCurrentRow();
  908. assertEquals(createExpectedRow("name", "row8",
  909. "id", 9,
  910. "data", "initial data"),
  911. row);
  912. String newText = "updated big data_" + createString(200);
  913. c.setCurrentRowValue(t.getColumn("data"), newText);
  914. c.reset();
  915. c.moveNextRows(9);
  916. row = c.getCurrentRow();
  917. assertEquals(createExpectedRow("name", "row8",
  918. "id", 9,
  919. "data", newText),
  920. row);
  921. db.close();
  922. }
  923. }
  924. public void testFixedText() throws Exception
  925. {
  926. for (final TestDB testDB : TestDB.getSupportedForBasename(Basename.FIXED_TEXT)) {
  927. Database db = openCopy(testDB);
  928. Table t = db.getTable("users");
  929. Column c = t.getColumn("c_flag_");
  930. assertEquals(DataType.TEXT, c.getType());
  931. assertEquals(false, c.isVariableLength());
  932. assertEquals(2, c.getLength());
  933. Map<String,Object> row = t.getNextRow();
  934. assertEquals("N", row.get("c_flag_"));
  935. t.addRow(3, "testFixedText", "boo", "foo", "bob", 3, 5, 9, "Y",
  936. new Date());
  937. t.getNextRow();
  938. row = t.getNextRow();
  939. assertEquals("testFixedText", row.get("c_user_login"));
  940. assertEquals("Y", row.get("c_flag_"));
  941. db.close();
  942. }
  943. }
  944. static Object[] createTestRow(String col1Val) {
  945. return new Object[] {col1Val, "R", "McCune", 1234, (byte) 0xad, 555.66d,
  946. 777.88f, (short) 999, new Date()};
  947. }
  948. static Object[] createTestRow() {
  949. return createTestRow("Tim");
  950. }
  951. static void createTestTable(Database db) throws Exception {
  952. new TableBuilder("test")
  953. .addColumn(new ColumnBuilder("A", DataType.TEXT))
  954. .addColumn(new ColumnBuilder("B", DataType.TEXT))
  955. .addColumn(new ColumnBuilder("C", DataType.TEXT))
  956. .addColumn(new ColumnBuilder("D", DataType.LONG))
  957. .addColumn(new ColumnBuilder("E", DataType.BYTE))
  958. .addColumn(new ColumnBuilder("F", DataType.DOUBLE))
  959. .addColumn(new ColumnBuilder("G", DataType.FLOAT))
  960. .addColumn(new ColumnBuilder("H", DataType.INT))
  961. .addColumn(new ColumnBuilder("I", DataType.SHORT_DATE_TIME))
  962. .toTable(db);
  963. }
  964. static String createString(int len) {
  965. return createString(len, 'a');
  966. }
  967. static String createNonAsciiString(int len) {
  968. return createString(len, '\u00C0');
  969. }
  970. private static String createString(int len, char firstChar) {
  971. StringBuilder builder = new StringBuilder(len);
  972. for(int i = 0; i < len; ++i) {
  973. builder.append((char)(firstChar + (i % 26)));
  974. }
  975. return builder.toString();
  976. }
  977. static void assertRowCount(int expectedRowCount, Table table)
  978. throws Exception
  979. {
  980. assertEquals(expectedRowCount, countRows(table));
  981. assertEquals(expectedRowCount, table.getRowCount());
  982. }
  983. static int countRows(Table table) throws Exception {
  984. int rtn = 0;
  985. for(Map<String, Object> row : Cursor.createCursor(table)) {
  986. rtn++;
  987. }
  988. return rtn;
  989. }
  990. static void assertTable(List<Map<String, Object>> expectedTable, Table table)
  991. {
  992. assertCursor(expectedTable, Cursor.createCursor(table));
  993. }
  994. static void assertCursor(List<Map<String, Object>> expectedTable,
  995. Cursor cursor)
  996. {
  997. List<Map<String, Object>> foundTable =
  998. new ArrayList<Map<String, Object>>();
  999. for(Map<String, Object> row : cursor) {
  1000. foundTable.add(row);
  1001. }
  1002. assertEquals(expectedTable, foundTable);
  1003. }
  1004. static Map<String, Object> createExpectedRow(Object... rowElements) {
  1005. Map<String, Object> row = new LinkedHashMap<String, Object>();
  1006. for(int i = 0; i < rowElements.length; i += 2) {
  1007. row.put((String)rowElements[i],
  1008. rowElements[i + 1]);
  1009. }
  1010. return row;
  1011. }
  1012. @SuppressWarnings("unchecked")
  1013. static List<Map<String, Object>> createExpectedTable(Map... rows) {
  1014. return Arrays.<Map<String, Object>>asList(rows);
  1015. }
  1016. static void dumpDatabase(Database mdb) throws Exception {
  1017. dumpDatabase(mdb, new PrintWriter(System.out, true));
  1018. }
  1019. static void dumpTable(Table table) throws Exception {
  1020. dumpTable(table, new PrintWriter(System.out, true));
  1021. }
  1022. static void dumpDatabase(Database mdb, PrintWriter writer) throws Exception {
  1023. writer.println("DATABASE:");
  1024. for(Table table : mdb) {
  1025. dumpTable(table, writer);
  1026. }
  1027. }
  1028. static void dumpTable(Table table, PrintWriter writer) throws Exception {
  1029. // make sure all indexes are read
  1030. for(Index index : table.getIndexes()) {
  1031. index.initialize();
  1032. }
  1033. writer.println("TABLE: " + table.getName());
  1034. List<String> colNames = new ArrayList<String>();
  1035. for(Column col : table.getColumns()) {
  1036. colNames.add(col.getName());
  1037. }
  1038. writer.println("COLUMNS: " + colNames);
  1039. for(Map<String, Object> row : Cursor.createCursor(table)) {
  1040. // make byte[] printable
  1041. for(Map.Entry<String, Object> entry : row.entrySet()) {
  1042. Object v = entry.getValue();
  1043. if(v instanceof byte[]) {
  1044. byte[] bv = (byte[])v;
  1045. entry.setValue(ByteUtil.toHexString(ByteBuffer.wrap(bv), bv.length));
  1046. }
  1047. }
  1048. writer.println(row);
  1049. }
  1050. }
  1051. static void dumpIndex(Index index) throws Exception {
  1052. dumpIndex(index, new PrintWriter(System.out, true));
  1053. }
  1054. static void dumpIndex(Index index, PrintWriter writer) throws Exception {
  1055. writer.println("INDEX: " + index);
  1056. IndexData.EntryCursor ec = index.cursor();
  1057. IndexData.Entry lastE = ec.getLastEntry();
  1058. IndexData.Entry e = null;
  1059. while((e = ec.getNextEntry()) != lastE) {
  1060. writer.println(e);
  1061. }
  1062. }
  1063. static void copyFile(File srcFile, File dstFile)
  1064. throws IOException
  1065. {
  1066. // FIXME should really be using commons io FileUtils here, but don't want
  1067. // to add dep for one simple test method
  1068. byte[] buf = new byte[1024];
  1069. OutputStream ostream = new FileOutputStream(dstFile);
  1070. InputStream istream = new FileInputStream(srcFile);
  1071. try {
  1072. int numBytes = 0;
  1073. while((numBytes = istream.read(buf)) >= 0) {
  1074. ostream.write(buf, 0, numBytes);
  1075. }
  1076. } finally {
  1077. ostream.close();
  1078. }
  1079. }
  1080. static File createTempFile(boolean keep) throws Exception {
  1081. File tmp = File.createTempFile("databaseTest", ".mdb");
  1082. if(keep) {
  1083. System.out.println("Created " + tmp);
  1084. } else {
  1085. tmp.deleteOnExit();
  1086. }
  1087. return tmp;
  1088. }
  1089. static byte[] toByteArray(File file)
  1090. throws IOException
  1091. {
  1092. // FIXME should really be using commons io IOUtils here, but don't want
  1093. // to add dep for one simple test method
  1094. FileInputStream istream = new FileInputStream(file);
  1095. try {
  1096. byte[] bytes = new byte[(int)file.length()];
  1097. istream.read(bytes);
  1098. return bytes;
  1099. } finally {
  1100. istream.close();
  1101. }
  1102. }
  1103. }