Here's a simple C++ program that demonstrates how to perform basic CRUD (Create, Read, Update, Delete) operations using GDBM (GNU Database Manager). This example will show how to store key-value pairs, retrieve them, update them, and delete them using the GDBM API.
C++ Program with GDBM
cpp#include <gdbm.h>
#include <iostream>
#include <cstring>
class GDBMWrapper {
public:
GDBMWrapper(const char* filename) {
db = gdbm_open((char*)filename, 512, GDBM_WRCREAT, 0666, 0);
if (!db) {
throw std::runtime_error("Failed to open GDBM database");
}
}
~GDBMWrapper() {
if (db) {
gdbm_close(db);
}
}
void create(const std::string& key, const std::string& value) {
datum db_key = { (char*)key.c_str(), (int)key.size() };
datum db_value = { (char*)value.c_str(), (int)value.size() };
if (gdbm_store(db, db_key, db_value, GDBM_INSERT) != 0) {
throw std::runtime_error("Failed to insert record");
}
}
std::string read(const std::string& key) {
datum db_key = { (char*)key.c_str(), (int)key.size() };
datum db_value = gdbm_fetch(db, db_key);
if (!db_value.dptr) {
throw std::runtime_error("Key not found");
}
std::string value(db_value.dptr, db_value.dsize);
free(db_value.dptr);
return value;
}
void update(const std::string& key, const std::string& new_value) {
datum db_key = { (char*)key.c_str(), (int)key.size() };
datum db_value = { (char*)new_value.c_str(), (int)new_value.size() };
if (gdbm_store(db, db_key, db_value, GDBM_REPLACE) != 0) {
throw std::runtime_error("Failed to update record");
}
}
void remove(const std::string& key) {
datum db_key = { (char*)key.c_str(), (int)key.size() };
if (gdbm_delete(db, db_key) != 0) {
throw std::runtime_error("Failed to delete record");
}
}
private:
GDBM_FILE db;
};
int main() {
try {
GDBMWrapper db("example.db");
// Create
db.create("name", "John Doe");
db.create("email", "johndoe@example.com");
// Read
std::cout << "Name: " << db.read("name") << std::endl;
std::cout << "Email: " << db.read("email") << std::endl;
// Update
db.update("email", "john.doe@newdomain.com");
std::cout << "Updated Email: " << db.read("email") << std::endl;
// Delete
db.remove("name");
std::cout << "Deleted 'name' record." << std::endl;
// Try to read the deleted record (will throw an exception)
try {
std::cout << "Name: " << db.read("name") << std::endl;
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
return 1;
}
return 0;
}
Explanation
GDBMWrapper Class:
- This class wraps the GDBM functions to make it easier to manage database operations.
- The constructor opens the database file, and the destructor ensures the database is closed properly.
- The
create
,read
,update
, andremove
methods handle the corresponding CRUD operations using the GDBM API.
CRUD Operations:
- Create: Inserts a new key-value pair using
gdbm_store
withGDBM_INSERT
. - Read: Retrieves a value for a given key using
gdbm_fetch
. - Update: Replaces the value for a given key using
gdbm_store
withGDBM_REPLACE
. - Delete: Removes a key-value pair using
gdbm_delete
.
- Create: Inserts a new key-value pair using
Error Handling:
- The program uses exceptions to handle errors such as failing to open the database, trying to read a non-existent key, etc.
Compilation
To compile this program, you'll need to link against the GDBM library:
shg++ -o gdbm_example gdbm_example.cpp -lgdbm
Running the Program
Once compiled, you can run the program:
sh./gdbm_example
This will perform the CRUD operations, demonstrating how to interact with a GDBM database using C++.
Comments
Post a Comment
If you have any doubts, please let me know.