This project is a simple key-value store database implemented in Go, inspired by NoSQL databases such as MongoDB. It allows for dynamic data storage using map[string]interface{} and supports basic CRUD (Create, Read, Update, Delete) operations, along with query capabilities. Currently, the data is stored only in JSON files, as a key-value storage engine, like Bitcask, has not yet been implemented.
- Dynamic Schema: Stores data without requiring predefined models or structures.
- CRUD Operations: Supports Create, Read, Update, Delete operations for collections.
- Query Functionality: Query collections using a custom filter function to search for records.
- File-based Storage: Data is stored in JSON format in the local file system.
- Concurrency Safe: Uses
sync.Mutex
to manage concurrent access to collections.
- Go 1.16 or later
-
Clone the repository:
git clone https://github.com/Mahopanda/golang-database.git
-
Navigate to the project directory:
cd golang-database
- Install dependencies (if any):
go mod tidy
- Initialize the Logger, Storage, and Driver:
logger := database.NewConsoleLogger()
serializer := &database.JSONSerializer{}
store := database.NewFileStore("./storage", serializer)
db := database.NewDriver(store, lockManager, logger)
- Insert Data:
user := map[string]interface{}{
"Name": "John",
"Age": 30,
"Contact": "[email protected]",
}
err := db.Write("users", "john", user)
if err != nil {
logger.Error("Failed to write user:", err)
}
- Read Data:
var result map[string]interface{}
err := db.Read("users", "john", &result)
if err != nil {
logger.Error("Failed to read user:", err)
}
- Query Data:
results, err := db.Query("users", func(data map[string]interface{}) bool {
return data["Age"] == 30
})
- Delete Data:
err := db.Delete("users", "john")
if err != nil {
logger.Error("Failed to delete user:", err)
}
To run the unit tests for the project, execute the following command:
go test ./...
├── database/ # Core logic for the key-value database
│ ├── driver.go # Handles high-level operations and concurrency control
│ ├── storage.go # File-based storage implementation
│ ├── lock_manager.go # Contains logic for Lock Manager
│ └── logger.go # Logger implementation
│ └── serializer.go # Contains logic for Serializer
├── test/ # Test cases for the database
└── main.go # Example usage of the key-value database