public static Database buildsecondary(Database std) { // Parse database loaded try { io.deleteFile("secondarydb"); // SecondaryDatabases started DatabaseConfig dbConfig = new DatabaseConfig(); dbConfig.setType(DatabaseType.HASH); dbConfig.setAllowCreate(true); dbConfig.setUnsortedDuplicates(true); Database secdb = new Database("secondarydb", null, dbConfig); // Cursors started Cursor stdcursor = std.openCursor(null, null); Cursor secdbcursor = secdb.openCursor(null, null); // Key and Data started DatabaseEntry stdkey = new DatabaseEntry(); DatabaseEntry stddata = new DatabaseEntry(); DatabaseEntry seckey = new DatabaseEntry(); DatabaseEntry secdata = new DatabaseEntry(); while (stdcursor.getNext(stdkey, stddata, LockMode.DEFAULT) == OperationStatus.SUCCESS) { // Writing into secondary db String[] key = new String(stdkey.getData()).split(","); String data = new String(stddata.getData()); // DEBUG: // System.out.println("key 0:" + key[0] + " key 1:" + key[1] + " data:" + data); seckey.setData(key[1].getBytes()); OperationStatus operation = secdbcursor.getSearchKey(seckey, secdata, LockMode.DEFAULT); String b = null; while (operation == OperationStatus.SUCCESS) { b = new String(secdata.getData()); secdbcursor.delete(); operation = secdbcursor.getNextDup(seckey, secdata, LockMode.DEFAULT); } if (b == null) { seckey.setData(key[1].getBytes()); secdata.setData(("(" + key[0] + "," + data + ")").getBytes()); secdb.put(null, seckey, secdata); } if (b != null) { secdata.setData(b.concat("(" + key[0] + "," + data + ")").getBytes()); secdb.put(null, seckey, secdata); } seckey.setData(null); secdata.setData(null); stdkey.setData(null); stddata.setData(null); } // io.debugread(secdb); return secdb; } catch (Exception e) { System.out.println("Error creating <user>,<song,rating> secondary table!\n"); System.out.println(e.getMessage()); } return null; // SHOULD NEVER HAPPEN }
public void delete(int count) throws DatabaseException { synchronized (mutex) { int matches = 0; Cursor cursor = null; OperationStatus result; DatabaseEntry key = new DatabaseEntry(); DatabaseEntry value = new DatabaseEntry(); Transaction txn; if (resumable) { txn = env.beginTransaction(null, null); } else { txn = null; } try { cursor = urlsDB.openCursor(txn, null); result = cursor.getFirst(key, value, null); while (matches < count && result == OperationStatus.SUCCESS) { cursor.delete(); matches++; result = cursor.getNext(key, value, null); } } catch (DatabaseException e) { if (txn != null) { txn.abort(); txn = null; } throw e; } finally { if (cursor != null) { cursor.close(); } if (txn != null) { txn.commit(); } } } }
public static String top3(String line, Database secdb, Database tdb) throws DatabaseException, FileNotFoundException { // configure sqSum db for keeping track of cumulative squaresums io.deleteFile("sqSumdb"); DatabaseConfig dbConfig = new DatabaseConfig(); dbConfig.setType(DatabaseType.HASH); dbConfig.setAllowCreate(true); dbConfig.setUnsortedDuplicates(true); Database sqSumdb = new Database("sqSumdb", null, dbConfig); Cursor sqSumCurs = sqSumdb.openCursor(null, null); DatabaseEntry sqSumKey = new DatabaseEntry(); DatabaseEntry sqSumData = new DatabaseEntry(); Cursor secCurs = secdb.openCursor(null, null); Cursor tCurs = tdb.openCursor(null, null); DatabaseEntry secKey = new DatabaseEntry(); DatabaseEntry secData = new DatabaseEntry(); DatabaseEntry tKey = new DatabaseEntry(); DatabaseEntry tData = new DatabaseEntry(); // get input song users and ratings tKey.setData(line.getBytes()); if (tCurs.getSearchKey(tKey, tData, LockMode.DEFAULT) == OperationStatus.SUCCESS) { // for each user in input song, get songs and ratings HashMap<String, String> iRatings = parseBrace(new String(tData.getData())); for (String user : iRatings.keySet()) { // get current user's rating for input song int inputRating = Integer.parseInt(iRatings.get(user)); // get songs and ratings for user secKey.setData(null); secData.setData(null); secKey.setData(user.getBytes()); if (secCurs.getSearchKey(secKey, secData, null) == OperationStatus.SUCCESS) { // for each song rated by user HashMap<String, String> currSongs = parseBrace(new String(secData.getData())); for (String song : currSongs.keySet()) { // input song should not be compared to itself, otherwise get the users and ratings for // it if (song.equals(line)) continue; // current user's rating for song under inspection int songRating = Integer.parseInt(currSongs.get(song)); sqSumKey.setData(null); sqSumData.setData(null); sqSumKey.setData(song.getBytes()); if (sqSumCurs.getSearchKey(sqSumKey, sqSumData, null) == OperationStatus.SUCCESS) { // if song is already in sqSum,N db, add to it String[] sumN = (new String(sqSumData.getData())).split(","); // add the new square sum to the previous and increment N int sum = Integer.parseInt(sumN[0]); int N = Integer.parseInt(sumN[1]); sum += (inputRating - songRating) * (inputRating - songRating); N += 1; String encoded = Integer.toString(sum) + "," + Integer.toString(N); // remove old entry for current song and replace it with the new one sqSumCurs.delete(); sqSumKey.setData(null); sqSumData.setData(null); sqSumKey.setData(song.getBytes()); sqSumData.setData(encoded.getBytes()); sqSumdb.put(null, sqSumKey, sqSumData); } else { // if song in not already in sqSum,N db, create it int sum = (inputRating - songRating) * (inputRating - songRating); int N = 1; String encoded = Integer.toString(sum) + "," + Integer.toString(N); sqSumKey.setData(null); sqSumData.setData(null); sqSumKey.setData(song.getBytes()); sqSumData.setData(encoded.getBytes()); sqSumdb.put(null, sqSumKey, sqSumData); } } } else { System.out.println("ERROR: user " + user + " not in secondary database."); } } } else { return line + " has not been rated by any user."; } // DEBUG // io.debugread(sqSumdb); // calculate distance for each song in, inserting into the top 3 spots as we iterate through String ranked = rank(sqSumdb); return line + ", " + ranked; }
@Test public void testOpenReadOnly() throws Throwable { try { EnvironmentConfig envConfig = TestUtils.initEnvConfig(); envConfig.setTransactional(true); envConfig.setAllowCreate(true); env = create(envHome, envConfig); DatabaseEntry key = new DatabaseEntry(); DatabaseEntry data = new DatabaseEntry(); Transaction txn = env.beginTransaction(null, null); DatabaseConfig dbConfig = new DatabaseConfig(); dbConfig.setTransactional(true); dbConfig.setAllowCreate(true); Database myDb = env.openDatabase(txn, "testDB2", dbConfig); key.setData(TestUtils.getTestArray(0)); data.setData(TestUtils.getTestArray(0)); try { myDb.put(txn, key, data); } catch (DatabaseException DBE) { fail("unexpected DatabaseException during put"); } txn.commit(); myDb.close(); dbConfig = new DatabaseConfig(); dbConfig.setTransactional(true); dbConfig.setReadOnly(true); txn = env.beginTransaction(null, null); myDb = env.openDatabase(txn, "testDB2", dbConfig); assertTrue(myDb.isTransactional()); assertTrue(myDb.getConfig().getTransactional()); key.setData(TestUtils.getTestArray(0)); data.setData(TestUtils.getTestArray(0)); try { myDb.put(txn, key, data); fail("expected UnsupportedOperationException " + "because open RDONLY"); } catch (UnsupportedOperationException expected) { } key.setData(TestUtils.getTestArray(0)); data.setData(TestUtils.getTestArray(0)); assertEquals(OperationStatus.SUCCESS, myDb.get(txn, key, data, LockMode.DEFAULT)); Cursor cursor = myDb.openCursor(txn, null); assertEquals(OperationStatus.SUCCESS, cursor.getFirst(key, data, LockMode.DEFAULT)); try { cursor.delete(); fail("expected Exception from delete on RD_ONLY db"); } catch (UnsupportedOperationException e) { } key.setData(TestUtils.getTestArray(1)); data.setData(TestUtils.getTestArray(1)); try { myDb.put(txn, key, data); fail("expected UnsupportedOperationException because open RDONLY"); } catch (UnsupportedOperationException expected) { } cursor.close(); txn.commit(); myDb.close(); close(env); } catch (Throwable t) { t.printStackTrace(); throw t; } }