Files
kalzu-value-store/storage/storage.go
ryyst 5223438ddf refactor: extract storage system to storage package
Extracted BadgerDB operations, compression, and revision management
from main.go to dedicated storage package for better modularity.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-18 20:40:42 +03:00

112 lines
2.8 KiB
Go

package storage
import (
"fmt"
"time"
badger "github.com/dgraph-io/badger/v4"
"github.com/sirupsen/logrus"
"kvs/types"
)
// StorageService handles all BadgerDB operations and data management
type StorageService struct {
db *badger.DB
config *types.Config
compressionSvc *CompressionService
logger *logrus.Logger
}
// NewStorageService creates a new storage service
func NewStorageService(db *badger.DB, config *types.Config, logger *logrus.Logger) (*StorageService, error) {
var compressionSvc *CompressionService
var err error
// Initialize compression if enabled
if config.CompressionEnabled {
compressionSvc, err = NewCompressionService()
if err != nil {
return nil, fmt.Errorf("failed to initialize compression: %v", err)
}
}
return &StorageService{
db: db,
config: config,
compressionSvc: compressionSvc,
logger: logger,
}, nil
}
// Close closes the storage service and its resources
func (s *StorageService) Close() {
if s.compressionSvc != nil {
s.compressionSvc.Close()
}
}
// StoreWithTTL stores data with optional TTL and compression
func (s *StorageService) StoreWithTTL(txn *badger.Txn, key []byte, data []byte, ttl time.Duration) error {
var finalData []byte
var err error
// Compress data if compression is enabled
if s.config.CompressionEnabled && s.compressionSvc != nil {
finalData, err = s.compressionSvc.CompressData(data)
if err != nil {
return fmt.Errorf("failed to compress data: %v", err)
}
} else {
finalData = data
}
entry := badger.NewEntry(key, finalData)
// Apply TTL if specified
if ttl > 0 {
entry = entry.WithTTL(ttl)
}
return txn.SetEntry(entry)
}
// RetrieveWithDecompression retrieves and decompresses data from BadgerDB
func (s *StorageService) RetrieveWithDecompression(txn *badger.Txn, key []byte) ([]byte, error) {
item, err := txn.Get(key)
if err != nil {
return nil, err
}
var compressedData []byte
err = item.Value(func(val []byte) error {
compressedData = append(compressedData, val...)
return nil
})
if err != nil {
return nil, err
}
// Decompress data if compression is enabled
if s.config.CompressionEnabled && s.compressionSvc != nil {
return s.compressionSvc.DecompressData(compressedData)
}
return compressedData, nil
}
// CompressData compresses data using the compression service
func (s *StorageService) CompressData(data []byte) ([]byte, error) {
if !s.config.CompressionEnabled || s.compressionSvc == nil {
return data, nil
}
return s.compressionSvc.CompressData(data)
}
// DecompressData decompresses data using the compression service
func (s *StorageService) DecompressData(compressedData []byte) ([]byte, error) {
if !s.config.CompressionEnabled || s.compressionSvc == nil {
return compressedData, nil
}
return s.compressionSvc.DecompressData(compressedData)
}