heroagent/pkg/data/ourdb
2025-04-23 04:18:28 +02:00
..
backend.go ... 2025-04-23 04:18:28 +02:00
client.go ... 2025-04-23 04:18:28 +02:00
db_test.go ... 2025-04-23 04:18:28 +02:00
db.go ... 2025-04-23 04:18:28 +02:00
factory.go ... 2025-04-23 04:18:28 +02:00
location.go ... 2025-04-23 04:18:28 +02:00
lookup.go ... 2025-04-23 04:18:28 +02:00
ourdb_test.go ... 2025-04-23 04:18:28 +02:00
README.md ... 2025-04-23 04:18:28 +02:00

OurDB

OurDB is a simple key-value database implementation that provides:

  • Efficient key-value storage with history tracking
  • Data integrity verification using CRC32
  • Support for multiple backend files
  • Lookup table for fast data retrieval

Overview

The database consists of three main components:

  1. DB Interface - Provides the public API for database operations
  2. Lookup Table - Maps keys to data locations for efficient retrieval
  3. Backend Storage - Handles the actual data storage and file management

Features

  • Key-Value Storage: Store and retrieve binary data using numeric keys
  • History Tracking: Maintain a linked list of previous values for each key
  • Data Integrity: Verify data integrity using CRC32 checksums
  • Multiple Backends: Support for multiple storage files to handle large datasets
  • Incremental Mode: Automatically assign IDs for new records

Usage

Basic Usage

package main

import (
    "fmt"
    "log"
    
    "github.com/freeflowuniverse/heroagent/pkg/ourdb"
)

func main() {
    // Create a new database
    config := ourdb.DefaultConfig()
    config.Path = "/path/to/database"
    
    db, err := ourdb.New(config)
    if err != nil {
        log.Fatalf("Failed to create database: %v", err)
    }
    defer db.Close()
    
    // Store data
    data := []byte("Hello, World!")
    id := uint32(1)
    _, err = db.Set(ourdb.OurDBSetArgs{
        ID:   &id,
        Data: data,
    })
    if err != nil {
        log.Fatalf("Failed to store data: %v", err)
    }
    
    // Retrieve data
    retrievedData, err := db.Get(id)
    if err != nil {
        log.Fatalf("Failed to retrieve data: %v", err)
    }
    
    fmt.Printf("Retrieved data: %s\n", string(retrievedData))
}

Using the Client

package main

import (
    "fmt"
    "log"
    
    "github.com/freeflowuniverse/heroagent/pkg/ourdb"
)

func main() {
    // Create a new client
    client, err := ourdb.NewClient("/path/to/database")
    if err != nil {
        log.Fatalf("Failed to create client: %v", err)
    }
    defer client.Close()
    
    // Add data with auto-generated ID
    data := []byte("Hello, World!")
    id, err := client.Add(data)
    if err != nil {
        log.Fatalf("Failed to add data: %v", err)
    }
    
    fmt.Printf("Data stored with ID: %d\n", id)
    
    // Retrieve data
    retrievedData, err := client.Get(id)
    if err != nil {
        log.Fatalf("Failed to retrieve data: %v", err)
    }
    
    fmt.Printf("Retrieved data: %s\n", string(retrievedData))
    
    // Store data with specific ID
    err = client.Set(2, []byte("Another value"))
    if err != nil {
        log.Fatalf("Failed to set data: %v", err)
    }
    
    // Get history of a value
    history, err := client.GetHistory(id, 5)
    if err != nil {
        log.Fatalf("Failed to get history: %v", err)
    }
    
    fmt.Printf("History count: %d\n", len(history))
    
    // Delete data
    err = client.Delete(id)
    if err != nil {
        log.Fatalf("Failed to delete data: %v", err)
    }
}

Configuration Options

  • RecordNrMax: Maximum number of records (default: 16777215)
  • RecordSizeMax: Maximum size of a record in bytes (default: 4KB)
  • FileSize: Maximum size of a database file (default: 500MB)
  • IncrementalMode: Automatically assign IDs for new records (default: true)
  • Reset: Reset the database on initialization (default: false)

Notes

This is a Go port of the original V implementation from the herolib repository.