/*- * See the file LICENSE for redistribution information. * * Copyright (c) 2002, 2015 Oracle and/or its affiliates. All rights reserved. * */ package com.sleepycat.db.test; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import com.sleepycat.db.*; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import com.sleepycat.db.test.TestUtils; public class MultipleCursorTest { public static final String MULTIPLECURSORTEST_DBNAME = "multiplecursortest.db"; /* The data used by this test. */ private static final String[] Key_Strings = { "abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yza", "bcd", "efg", "hij", "klm", "nop", "qrs", "tuv", "wxy", }; private static boolean verbose = false; @BeforeClass public static void ClassInit() { TestUtils.loadConfig(null); TestUtils.check_file_removed(TestUtils.getDBFileName(MULTIPLECURSORTEST_DBNAME), true, true); TestUtils.removeall(true, true, TestUtils.BASETEST_DBDIR, TestUtils.getDBFileName(MULTIPLECURSORTEST_DBNAME)); } @AfterClass public static void ClassShutdown() { TestUtils.check_file_removed(TestUtils.getDBFileName(MULTIPLECURSORTEST_DBNAME), true, true); TestUtils.removeall(true, true, TestUtils.BASETEST_DBDIR, TestUtils.getDBFileName(MULTIPLECURSORTEST_DBNAME)); } @Before public void PerTestInit() throws Exception { } @After public void PerTestShutdown() throws Exception { } public static void main(String []argv) { verbose = true; if (argv.length > 0 && argv[0].equals("-s")) { try { java.lang.Thread.sleep(15*1000); } catch (InterruptedException e) { } } try { MultipleCursorTest mpt = new MultipleCursorTest(); mpt.testMultiplePut(); mpt.testMultipleDelete(); } catch (DatabaseException dbe) { System.out.println("MultipleCursorTest threw DatabaseException"); } catch (FileNotFoundException fnfe) { System.out.println("MultipleCursorTest threw FileNotFound"); } } /* * Test case implementations. * To disable a test mark it with @Ignore * To set a timeout(ms) notate like: @Test(timeout=1000) * To indicate an expected exception notate like: (expected=Exception) */ @Test public void testMultiplePut() throws DatabaseException, FileNotFoundException { Database db = createDatabase(); byte [] buffer = new byte[1024]; byte [] buffer2 = new byte[1024]; int i; /* Build up a bulk key/data pair. */ MultipleKeyDataEntry kd = new MultipleKeyDataEntry(buffer); DatabaseEntry key = new DatabaseEntry(); DatabaseEntry data = new DatabaseEntry(); /* Put 3 in the first round. */ for (i = 0; i < 3; i++) { key.setData(Key_Strings[i].getBytes()); data.setData(Key_Strings[i].getBytes()); kd.append(key, data); } if (verbose) System.out.println("Built up a multi-key/data buffer."); db.putMultipleKey(null, kd, false); if (verbose) System.out.println("Put a multi-key/data buffer."); /* Build up separate bulk key/data DatabaseEntries */ MultipleDataEntry keys = new MultipleDataEntry(buffer); MultipleDataEntry datas = new MultipleDataEntry(buffer2); /* Put 3 in the second round. */ for (; i < 6; i++) { key.setData(Key_Strings[i].getBytes()); data.setData(Key_Strings[i].getBytes()); keys.append(key); datas.append(data); } if (verbose) System.out.println("Built up multi-key and data buffers."); db.putMultiple(null, keys, datas, false); if (verbose) System.out.println("Put multi-key and data buffers."); // Bulk cursor, adding single items. Cursor dbc = db.openCursor(null, CursorConfig.BULK_CURSOR); for (; i < 12; i++) { key.setData(Key_Strings[i].getBytes()); data.setData(Key_Strings[i].getBytes()); dbc.put(key, data); } dbc.close(); if (verbose) dumpDatabase(db); db.close(); } @Test public void testMultipleDelete() throws DatabaseException, FileNotFoundException { byte [] buffer = new byte[1024]; int i; Database db = createDatabase(); populateDatabase(db, 0); /* Build up separate bulk key/data DatabaseEntries */ MultipleDataEntry keys = new MultipleDataEntry(buffer); DatabaseEntry key = new DatabaseEntry(); /* Put 3 in the second round. */ for (i = 0; i < 6; i++) { key.setData(Key_Strings[i].getBytes()); keys.append(key); } db.deleteMultiple(null, keys); // Bulk cursor, adding single items. DatabaseEntry data = new DatabaseEntry(); Cursor dbc = db.openCursor(null, CursorConfig.BULK_CURSOR); for (; i < 12; i++) { key.setData(Key_Strings[i].getBytes()); dbc.getSearchKey(key, data, LockMode.DEFAULT); dbc.delete(); } dbc.close(); // Should have about 3 entries left. if (verbose) dumpDatabase(db); db.close(); } /* Not implemented yet. @Test public void testMultipleGet() throws DatabaseException, FileNotFoundException { Database db = createDatabase(); populateDatabase(db, 0); } */ private Database createDatabase() throws DatabaseException, FileNotFoundException { /* Create database. */ Database db; DatabaseConfig db_config = new DatabaseConfig(); String name = TestUtils.getDBFileName(MULTIPLECURSORTEST_DBNAME); db_config.setAllowCreate(true); db_config.setType(DatabaseType.BTREE); db_config.setSortedDuplicates(true); db = new Database(name, null, db_config); return db; } private void populateDatabase(Database db, int duplicates) throws DatabaseException, FileNotFoundException { DatabaseEntry key = new DatabaseEntry(); DatabaseEntry data = new DatabaseEntry(); for (int i = 0; i < Key_Strings.length; i++) { String datastr = new Integer(i).toString() + Key_Strings[i] + Key_Strings[i]; key.setData(Key_Strings[i].getBytes()); data.setData(datastr.getBytes()); db.put(null, key, data); for (int j = 0; j < duplicates; j++) { datastr = new Integer(j).toString() + datastr + Key_Strings[i]; data.setData(datastr.getBytes()); db.put(null, key, data); } } } private void dumpDatabase(Database db) { try { Cursor dbc = db.openCursor(null, CursorConfig.DEFAULT); DatabaseEntry key = new DatabaseEntry(); DatabaseEntry data = new DatabaseEntry(); System.out.println("Dumping database contents:"); while (dbc.getNext(key, data, LockMode.DEFAULT) != OperationStatus.NOTFOUND) { System.out.println("\tGot key : " + new String(key.getData())); System.out.println("\t data: " + new String(data.getData())); } System.out.println("Finished dumping database contents."); } catch (DatabaseException dbe) { System.err.println("dumpDatabase caught an exception."); } } }