diff --git a/src/main/java/com/oath/halodb/HaloDB.java b/src/main/java/com/oath/halodb/HaloDB.java index b0ea540..2424406 100644 --- a/src/main/java/com/oath/halodb/HaloDB.java +++ b/src/main/java/com/oath/halodb/HaloDB.java @@ -40,6 +40,10 @@ public byte[] get(byte[] key) throws HaloDBException { } } + public int size(byte[] key) { + return dbInternal.size(key); + } + public boolean put(byte[] key, byte[] value) throws HaloDBException { try { return dbInternal.put(key, value); @@ -56,6 +60,10 @@ public void delete(byte[] key) throws HaloDBException { } } + public boolean contains(byte[] key) { + return dbInternal.contains(key); + } + public void close() throws HaloDBException { try { dbInternal.close(); diff --git a/src/main/java/com/oath/halodb/HaloDBInternal.java b/src/main/java/com/oath/halodb/HaloDBInternal.java index a558cf0..ee47597 100644 --- a/src/main/java/com/oath/halodb/HaloDBInternal.java +++ b/src/main/java/com/oath/halodb/HaloDBInternal.java @@ -381,13 +381,17 @@ boolean clearSnapshot() { return false; } - return true; + return true; } else { logger.info("snapshot not existed"); return true; } } + boolean contains(byte[] key) { + return inMemoryIndex.containsKey(key); + } + void delete(byte[] key) throws IOException { writeLock.lock(); try { @@ -410,6 +414,15 @@ long size() { return inMemoryIndex.size(); } + int size(byte[] key) { + InMemoryIndexMetaData metaData = inMemoryIndex.get(key); + if (metaData == null) { + return -1; + } + + return metaData.getValueSize(); + } + void setIOErrorFlag() throws IOException { DBMetaData metaData = new DBMetaData(dbDirectory); metaData.loadFromFileIfExists(); diff --git a/src/test/java/com/oath/halodb/HaloDBTest.java b/src/test/java/com/oath/halodb/HaloDBTest.java index acd92b6..0e23ca6 100644 --- a/src/test/java/com/oath/halodb/HaloDBTest.java +++ b/src/test/java/com/oath/halodb/HaloDBTest.java @@ -76,6 +76,33 @@ public void testPutUpdateAndGetDB(HaloDBOptions options) throws HaloDBException }); } + @Test(dataProvider = "Options") + public void testPutAndContainsDB(HaloDBOptions options) throws HaloDBException { + String directory = TestUtils.getTestDirectory("HaloDBTest", "testPutAndGetDB"); + + options.setCompactionDisabled(true); + + HaloDB db = getTestDB(directory, options); + + int noOfRecords = 10_000; + List records = TestUtils.insertRandomRecordsOfSize(db, noOfRecords, 128); + + List missingKeys = new ArrayList<>(); + for (int i = 0; i < noOfRecords; i++) { + missingKeys.add(TestUtils.generateRandomByteArray(64)); + } + + List actual = new ArrayList<>(); + db.newIterator().forEachRemaining(actual::add); + + Assert.assertTrue(actual.containsAll(records) && records.containsAll(actual)); + + records.forEach(record -> Assert.assertTrue(db.contains(record.getKey()))); + + missingKeys.forEach(key -> Assert.assertFalse(db.contains(key))); + } + + @Test(dataProvider = "Options") public void testCreateCloseAndOpenDB(HaloDBOptions options) throws HaloDBException {