Categorygithub.com/dannyswat/filedb
repositorypackage
0.3.0-alpha
Repository: https://github.com/dannyswat/filedb.git
Documentation: pkg.go.dev

# README

FileDB

Build and Test

A filesystem based database with indexing written in Go.

Feature Overview

  • Store objects in file system
  • Automatically generate object ID
  • Support simple field indexing
  • It supports generics

Limitation

  • Not scalable
  • Not production tested
  • Not support query with value comparation

Latest Version

v0.3.0-alpha Please update to the latest version which fixed some bugs.

go get github.com/dannyswat/[email protected]

Future Plan

  • Test and fix bugs
  • Use it in another project

Example

package users

import "github.com/dannyswat/filedb"

type UserDB interface {
	Init() error
	GetUserByID(id int) (*User, error)
	GetUserByUserName(username string) (*User, error)
	GetUserByEmail(email string) (*User, error)
	CreateUser(user *User) error
	UpdateUser(user *User) error
	DeleteUser(id int) error
}

type userDB struct {
	db filedb.FileDB[*User]
}

func NewUserDB(path string) UserDB {
	return &userDB{
		db: filedb.NewFileDB[*User](path, []filedb.FileIndexConfig{
			{Field: "UserName", Unique: true},
			{Field: "Email", Unique: true},
		}),
	}
}

func (u *userDB) Init() error {
	return u.db.Init()
}

func (u *userDB) GetUserByID(id int) (*User, error) {
	user, err := u.db.Find(id)
	if err != nil {
		return nil, err
	}
	return user, nil
}

func (u *userDB) GetUserByUserName(username string) (*User, error) {
	users, err := u.db.List("UserName", username)
	if err != nil {
		return nil, err
	}
	if len(users) == 0 {
		return nil, nil
	}
	return users[0], nil
}

func (u *userDB) GetUserByEmail(email string) (*User, error) {
	users, err := u.db.List("Email", email)
	if err != nil {
		return nil, err
	}
	if len(users) == 0 {
		return nil, nil
	}
	return users[0], nil
}

func (u *userDB) CreateUser(user *User) error {
	return u.db.Insert(user)
}

func (u *userDB) UpdateUser(user *User) error {
	return u.db.Update(user)
}

func (u *userDB) DeleteUser(id int) error {
	return u.db.Delete(id)
}