README

Lily

db

Expand ▾ Collapse ▴

Documentation

Overview

Package lily 数据库

存储结构 {dataDir}/data/{dataName}/{formName}/{formName}.dat/idx...

{dataDir}/ Lily 服务工作目录

{dataDir}/data/ Lily 服务数据目录,目录下为已创建数据库目录集合

{dataDir}/data/{dataName}.../ 数据库目录,目录下为已创建表目录集合

{dataDir}/data/{dataName}.../{formName}.../ 表目录,目录下为表头部Hash数组对应数据目录集合以及索引目录集合

{dataDir}/data/{dataName}.../{formName}.../{index}.../ 表头部Hash数组对应索引数据文件集合

{dataDir}/data/{dataName}.../{formName}.../[0, 1, ... , 15]/ 表头部Hash数组对应数据文件集合

索引格式:5位key + 16位md5后key + 5位起始seek + 4位持续seek

索引起始seek最大值为1073741824,即每一个索引文件最大1G,新增一条索引超过1G则新开新的索引文件

索引持续seek最大值为16777216,即每一条存储value对象允许最大存储16777216个字节

Index

Constants

const (
	// FormTypeSQL 关系型数据存储方式
	FormTypeSQL = "FORM_TYPE_SQL"
	// FormTypeDoc 文档型数据存储方式
	FormTypeDoc = "FORM_TYPE_DOC"
)

Variables

var (

	// ErrDatabaseExist 自定义error信息
	ErrDatabaseExist = errors.New("database already exist")
	// ErrFormExist 自定义error信息
	ErrFormExist = errors.New("form already exist")
	// ErrKeyExist 自定义error信息
	ErrKeyExist = errors.New("key already exist")
	// ErrIndexExist 自定义error信息
	ErrIndexExist = errors.New("index already exist")
	// ErrDataIsNil 自定义error信息
	ErrDataIsNil = errors.New("database had never been created")
	// ErrKeyIsNil 自定义error信息
	ErrKeyIsNil = errors.New("put keyStructure can not be nil")
)

var (
	// ErrValueType value type error
	ErrValueType = errors.New("value type error")
	// ErrValueInvalid value is invalid
	ErrValueInvalid = errors.New("value is invalid")
)

var (
	// Version 版本号
	Version = "1.0"
)

Functions

func CreateDatabase

func CreateDatabase(serverURL, name, comment string) error

CreateDatabase 创建数据库

func CreateDoc

func CreateDoc(serverURL, dbName, name, comment string) error

CreateDoc 创建文档

func CreateTable

func CreateTable(serverURL, dbName, name, comment string) error

CreateTable 创建表

func Delete

func Delete(serverURL, databaseName, formName string, selector *api.Selector) (*api.Resp, error)

Delete 删除数据

func Execute

func Execute()

Execute cmd start

func FormatFormType

func FormatFormType(ft api.FormType) string

FormatFormType 通过api表类型获取数据库表类型

func FormatFormType2API

func FormatFormType2API(ft string) api.FormType

FormatFormType2API 通过数据库表类型获取api表类型

func Get

func Get(serverURL, databaseName, formName, key string) (*api.RespGet, error)

Get 获取数据

func GetD

func GetD(serverURL, key string) (*api.RespGetD, error)

GetD 获取数据

func ObtainDatabases

func ObtainDatabases(serverURL string) (*api.RespDatabases, error)

ObtainDatabases 获取数据库集合

func ObtainForms

func ObtainForms(serverURL, dbName string) (*api.RespForms, error)

ObtainForms 获取数据库表集合

func Put

func Put(serverURL, databaseName, formName, key, value string) (*api.RespPut, error)

Put 新增数据

func PutD

func PutD(serverURL, key, value string) (*api.RespPutD, error)

PutD 新增数据

func Remove

func Remove(serverURL, databaseName, formName, key string) (*api.Resp, error)

Remove 删除数据

func Select

func Select(serverURL, databaseName, formName string, selector *api.Selector) (*api.RespSelect, error)

Select 获取数据

func ServerStart

func ServerStart(conf *Conf)

ServerStart 启动服务

func Set

func Set(serverURL, databaseName, formName, key, value string) (*api.RespSet, error)

Set 新增数据

func SetD

func SetD(serverURL, key, value string) (*api.RespSetD, error)

SetD 新增数据

Types

type API

type API interface {
	// Start 启动lily
	Start()
	// Restart 重新启动lily
	Restart()
	// Stop 停止lily
	Stop()
	// GetDatabase 获取指定名称数据库
	GetDatabase(name string) Database
	// GetDatabases 获取数据库集合
	GetDatabases() []Database
	// CreateDatabase 新建数据库
	//
	// 新建数据库会同时创建一个名为_default的表,未指定表明的情况下使用put/get等方法会操作该表
	//
	// name 数据库名称
	CreateDatabase(name, comment string) (Database, error)
	// CreateForm 创建表
	//
	// databaseName 数据库名
	//
	// 默认自增ID索引
	//
	// name 表名称
	//
	// comment 表描述
	CreateForm(databaseName, formName, comment, formType string) error
	// CreateKey 新建主键
	//
	// databaseName 数据库名
	//
	// name 表名称
	//
	// keyStructure 主键结构名,按照规范结构组成的主键字段名称,由对象结构层级字段通过'.'组成,如'i','in.s'
	CreateKey(databaseName, formName string, keyStructure string) error
	// createIndex 新建索引
	//
	// databaseName 数据库名
	//
	// name 表名称
	//
	// keyStructure 索引结构名,按照规范结构组成的索引字段名称,由对象结构层级字段通过'.'组成,如'i','in.s'
	CreateIndex(databaseName, formName string, keyStructure string) error
	// PutD 新增数据
	//
	// 向_default表中新增一条数据,key相同则返回一个Error
	//
	// keyStructure 插入数据唯一key
	//
	// value 插入数据对象
	//
	// 返回 hashKey
	PutD(key string, value interface{}) (uint64, error)
	// SetD 设置数据,如果存在将被覆盖,如果不存在,则新建
	//
	// 向_default表中新增或更新一条数据,key相同则覆盖
	//
	// keyStructure 插入数据唯一key
	//
	// value 插入数据对象
	//
	// 返回 hashKey
	SetD(key string, value interface{}) (uint64, error)
	// GetD 获取数据
	//
	// 向_default表中查询一条数据并返回
	//
	// keyStructure 插入数据唯一key
	GetD(key string) (interface{}, error)
	// Put 新增数据
	//
	// 向指定表中新增一条数据,key相同则返回一个Error
	//
	// databaseName 数据库名
	//
	// formName 表名
	//
	// keyStructure 插入数据唯一key
	//
	// value 插入数据对象
	//
	// 返回 hashKey
	Put(databaseName, formName, key string, value interface{}) (uint64, error)
	// Set 设置数据,如果存在将被覆盖,如果不存在,则新建
	//
	// 向指定表中新增或更新一条数据,key相同则覆盖
	//
	// databaseName 数据库名
	//
	// formName 表名
	//
	// keyStructure 插入数据唯一key
	//
	// value 插入数据对象
	//
	// 返回 hashKey
	Set(databaseName, formName, key string, value interface{}) (uint64, error)
	// Get 获取数据
	//
	// 向指定表中查询一条数据并返回
	//
	// databaseName 数据库名
	//
	// formName 表名
	//
	// keyStructure 插入数据唯一key
	Get(databaseName, formName, key string) (interface{}, error)
	// Remove 删除数据
	//
	// 向指定表中删除一条数据并返回
	Remove(databaseName, formName, key string) error
	// Select 获取数据
	//
	// 向指定表中查询一条数据并返回
	//
	// databaseName 数据库名
	//
	// formName 表名
	//
	// selector 条件选择器
	//
	// int 返回检索条目数量
	Select(databaseName, formName string, selector *Selector) (int32, interface{}, error)
	// Delete 删除数据
	//
	// 向指定表中删除一条数据并返回
	//
	// databaseName 数据库名
	//
	// formName 表名
	//
	// selector 条件选择器
	//
	// int 返回检索条目数量
	Delete(databaseName, formName string, selector *Selector) (int32, error)
}

API 暴露公共API接口

提供通用 k-v 方法,无需创建新的数据库和表等对象

在创建 Lily 服务的时候,会默认创建‘sysDatabase’库,同时在该库中创建‘defaultForm’表

该接口的数据默认在上表中进行操作

type APIServer

type APIServer struct {
	Conf *Conf
}

APIServer APIServer

func (*APIServer) CreateDatabase

func (l *APIServer) CreateDatabase(ctx context.Context, req *api.ReqCreateDatabase) (*api.RespDatabase, error)

CreateDatabase 新建数据库

func (*APIServer) CreateForm

func (l *APIServer) CreateForm(ctx context.Context, req *api.ReqCreateForm) (*api.Resp, error)

CreateForm 创建表

func (*APIServer) CreateIndex

func (l *APIServer) CreateIndex(ctx context.Context, req *api.ReqCreateIndex) (*api.Resp, error)

CreateIndex 新建索引

func (*APIServer) CreateKey

func (l *APIServer) CreateKey(ctx context.Context, req *api.ReqCreateKey) (*api.Resp, error)

CreateKey 新建主键

func (*APIServer) Delete

func (l *APIServer) Delete(ctx context.Context, req *api.ReqDelete) (*api.RespDelete, error)

Delete 删除数据

func (*APIServer) Get

func (l *APIServer) Get(ctx context.Context, req *api.ReqGet) (*api.RespGet, error)

Get 获取数据

func (*APIServer) GetConf

func (l *APIServer) GetConf(ctx context.Context, req *api.ReqConf) (*api.RespConf, error)

GetConf 获取数据库引擎对象

func (*APIServer) GetD

func (l *APIServer) GetD(ctx context.Context, req *api.ReqGetD) (*api.RespGetD, error)

GetD 获取数据

func (*APIServer) ObtainDatabases

func (l *APIServer) ObtainDatabases(ctx context.Context, req *api.ReqDatabases) (*api.RespDatabases, error)

ObtainDatabases 获取数据库集合

func (*APIServer) ObtainForms

func (l *APIServer) ObtainForms(ctx context.Context, req *api.ReqForms) (*api.RespForms, error)

ObtainForms 获取数据库表集合

func (*APIServer) Put

func (l *APIServer) Put(ctx context.Context, req *api.ReqPut) (*api.RespPut, error)

Put 新增数据

func (*APIServer) PutD

func (l *APIServer) PutD(ctx context.Context, req *api.ReqPutD) (*api.RespPutD, error)

PutD 新增数据

func (*APIServer) Remove

func (l *APIServer) Remove(ctx context.Context, req *api.ReqRemove) (*api.Resp, error)

Remove 删除数据

func (*APIServer) Select

func (l *APIServer) Select(ctx context.Context, req *api.ReqSelect) (*api.RespSelect, error)

Select 获取数据

func (*APIServer) Set

func (l *APIServer) Set(ctx context.Context, req *api.ReqSet) (*api.RespSet, error)

Set 新增数据

func (*APIServer) SetD

func (l *APIServer) SetD(ctx context.Context, req *api.ReqSetD) (*api.RespSetD, error)

SetD 新增数据

type Conf

type Conf struct {
	Port                     string `yaml:"Port"`                     // Port 开放端口,便于其它应用访问
	RootDir                  string `yaml:"RootDir"`                  // RootDir Lily服务默认存储路径
	DataDir                  string `yaml:"DataDir"`                  // DataDir Lily服务数据默认存储路径
	LimitOpenFile            int32  `yaml:"LimitOpenFile"`            // LimitOpenFile 限制打开文件描述符次数
	TLS                      bool   `yaml:"TLS"`                      // TLS 是否开启 TLS
	TLSServerKeyFile         string `yaml:"TLSServerKeyFile"`         // TLSServerKeyFile lily服务私钥
	TLSServerCertFile        string `yaml:"TLSServerCertFile"`        // TLSServerCertFile lily服务数字证书
	Limit                    bool   `yaml:"Limit"`                    // Limit 是否启用服务限流策略
	LimitMillisecond         int32  `yaml:"LimitMillisecond"`         // LimitMillisecond 请求限定的时间段(毫秒)
	LimitCount               int32  `yaml:"LimitCount"`               // LimitCount 请求限定的时间段内允许的请求次数
	LimitIntervalMicrosecond int32  `yaml:"LimitIntervalMicrosecond"` // LimitIntervalMillisecond 请求允许的最小间隔时间(微秒),0表示不限
	LogDir                   string `yaml:"LogDir"`                   // LogDir Lily服务默认日志存储路径
	LogLevel                 string `yaml:"LogLevel"`                 // LogLevel 日志级别(debug/info/warn/Error/panic/fatal)
	LogFileMaxSize           int    `yaml:"LogFileMaxSize"`           // LogFileMaxSize 每个日志文件保存的最大尺寸 单位:M
	LogFileMaxAge            int    `yaml:"LogFileMaxAge"`            // LogFileMaxAge 文件最多保存多少天
	LogUtc                   bool   `yaml:"LogUtc"`                   // LogUtc CST & UTC 时间
	Production               bool   `yaml:"Production"`               // Production 是否生产环境,在生产环境下控制台不会输出任何日志
	LilyLockFilePath         string `yaml:"lily_lock_file_path"`      // LilyLockFilePath Lily当前进程地址存储文件地址
	LilyBootstrapFilePath    string `yaml:"lily_bootstrap_file_path"` // LilyBootstrapFilePath Lily重启引导文件地址
}

Conf lily启动配置文件子项目

func GetConf

func GetConf(serverURL string) (*Conf, error)

GetConf 获取数据库集合

func ObtainConf

func ObtainConf(filePath string) *Conf

ObtainConf 根据文件地址获取Config对象

type DTODatabase

type DTODatabase struct {
	Name    string // Name 数据库名称,根据需求可以随时变化
	Comment string // Comment 描述
}

DTODatabase 数据库对象

type DTOForm

type DTOForm struct {
	Name    string // Name 数据库名称,根据需求可以随时变化
	Comment string // Comment 描述
	Type    string // Type 类型
}

DTOForm 数据库表对象

type Database

type Database interface {
	// contains filtered or unexported methods
}

Database 数据库接口

提供数据库基本操作方法

type Form

type Form interface {
	WriteLocker // WriteLocker 读写锁接口
	// contains filtered or unexported methods
}

Form 表接口

提供表基本操作方法

type Index

type Index interface {
	WriteLocker // WriteLocker 读写锁接口
	// contains filtered or unexported methods
}

Index 索引接口

type IndexBack

type IndexBack interface {
	// contains filtered or unexported methods
}

IndexBack 索引检索回调结果接口

type Leaf

type Leaf interface {
	Nodal
	// contains filtered or unexported methods
}

Leaf 叶子节点对象接口

type Lily

type Lily struct {
	// contains filtered or unexported fields
}

Lily 祖宗!

全库唯一常住内存对象,并持有所有库的句柄

API 入口

存储格式 {dataDir}/Data/{dataName}/{formName}/{formName}.dat/idx...

func ObtainLily

func ObtainLily() *Lily

ObtainLily 获取 Lily 对象

会初始化一个空 Lily,如果是第一次调用的话

首次调用后需要执行 initialize() 初始化方法

或者通过外部调用 Start() 来执行初始化操作

调用 Restart() 会恢复 Lily 的索引,如果 Lily 索引存在,则 Restart() 什么也不会做

会返回一个已创建的 Lily,如果非第一次调用的话

func (*Lily) CreateDatabase

func (l *Lily) CreateDatabase(name, comment string) (Database, error)

CreateDatabase 新建数据库

新建数据库会同时创建一个名为_default的表,未指定表明的情况下使用put/get等方法会操作该表

name 数据库名称

comment 数据库描述

func (*Lily) CreateForm

func (l *Lily) CreateForm(databaseName, formName, comment, formType string) error

CreateForm 创建表

默认自增ID索引

name 表名称

comment 表描述

func (*Lily) CreateIndex

func (l *Lily) CreateIndex(databaseName, formName string, keyStructure string) error

CreateIndex 新建索引

databaseName 数据库名

name 表名称

keyStructure 索引结构名,按照规范结构组成的索引字段名称,由对象结构层级字段通过'.'组成,如'i','in.s'

func (*Lily) CreateKey

func (l *Lily) CreateKey(databaseName, formName string, keyStructure string) error

CreateKey 新建主键

databaseName 数据库名

name 表名称

keyStructure 主键结构名,按照规范结构组成的主键字段名称,由对象结构层级字段通过'.'组成,如'i','in.s'

func (*Lily) Delete

func (l *Lily) Delete(databaseName, formName string, selector *Selector) (int32, error)

Delete 删除数据

向指定表中删除一条数据并返回

databaseName 数据库名

formName 表名

selector 条件选择器

func (*Lily) Get

func (l *Lily) Get(databaseName, formName, key string) (interface{}, error)

Get 获取数据

向指定表中查询一条数据并返回

databaseName 数据库名

formName 表名

keyStructure 插入数据唯一key

func (*Lily) GetD

func (l *Lily) GetD(key string) (interface{}, error)

GetD 获取数据

向_default表中查询一条数据并返回

keyStructure 插入数据唯一key

func (*Lily) GetDatabase

func (l *Lily) GetDatabase(name string) Database

GetDatabase 获取数据库集合

func (*Lily) GetDatabases

func (l *Lily) GetDatabases() []Database

GetDatabases 获取数据库集合

func (*Lily) Put

func (l *Lily) Put(databaseName, formName, key string, value interface{}) (uint64, error)

Put 新增数据

向指定表中新增一条数据,key相同则返回一个Error

databaseName 数据库名

formName 表名

keyStructure 插入数据唯一key

value 插入数据对象

返回 hashKey

func (*Lily) PutD

func (l *Lily) PutD(key string, value interface{}) (uint64, error)

PutD 新增数据

向_default表中新增一条数据,key相同则返回一个Error

keyStructure 插入数据唯一key

value 插入数据对象

返回 hashKey

func (*Lily) Remove

func (l *Lily) Remove(databaseName, formName, key string) error

Remove 删除数据

向指定表中删除一条数据并返回

func (*Lily) Restart

func (l *Lily) Restart()

Restart 重新启动lily

调用 Restart() 会恢复 Lily 的索引,如果 Lily 索引存在,则 Restart() 什么也不会做

func (*Lily) Select

func (l *Lily) Select(databaseName, formName string, selector *Selector) (int32, interface{}, error)

Select 获取数据

向指定表中查询一条数据并返回

formName 表名

keyStructure 插入数据唯一key

func (*Lily) Set

func (l *Lily) Set(databaseName, formName, key string, value interface{}) (uint64, error)

Set 新增数据

向指定表中新增一条数据,key相同则覆盖

databaseName 数据库名

formName 表名

keyStructure 插入数据唯一key

value 插入数据对象

返回 hashKey

func (*Lily) SetD

func (l *Lily) SetD(key string, value interface{}) (uint64, error)

SetD 新增数据

向_default表中新增一条数据,key相同则覆盖

keyStructure 插入数据唯一key

value 插入数据对象

返回 hashKey

func (*Lily) Start

func (l *Lily) Start()

Start 启动lily

调用后执行 initialize() 初始化方法

func (*Lily) Stop

func (l *Lily) Stop()

Stop 停止lily

type Link interface {
	WriteLocker // WriteLocker 读写锁接口
	// contains filtered or unexported methods
}

Link 叶子节点下的链表对象接口

type Nodal

type Nodal interface {
	WriteLocker // WriteLocker 读写锁接口
	// contains filtered or unexported methods
}

Nodal 节点对象接口

type Selector

type Selector struct {
	Conditions []*condition `json:"conditions"` // Conditions 条件查询
	Skip       uint32       `json:"skip"`       // Skip 结果集跳过数量
	Sort       *sort        `json:"sort"`       // Sort 排序方式
	Limit      uint32       `json:"limit"`      // Limit 结果集顺序数量
	// contains filtered or unexported fields
}

Selector 检索选择器

查询顺序 scope -> match -> conditions -> skip -> sort -> limit

type WriteLocker

type WriteLocker interface {
	// contains filtered or unexported methods
}

WriteLocker 读写锁接口

type YamlConf

type YamlConf struct {
	Conf *Conf `yaml:"conf"`
}

YamlConf lily启动配置文件根项目

Directories

Path Synopsis
api
bus Package bus 数据库全局管理器,包括数据库全局配置策略、接入安全认证、用户权限管理、数据备份、数据恢复、数据迁移以及数据库集群化部署策略等。
cache Package cache 共享在内存中的完全一样的查询语句和对应的执行选择器。
connector Package connector 数据存储引擎标准化接口,对外提供服务的统一接口,是所有已实现或待实现存储引擎都遵从的接口策略。
engine Package engine 存储引擎
engine/class Package class 数据库存储模型,如B+Tree等。
engine/index Package index 数据库索引服务
engine/storage Package storage 数据真实存储操作
package
parse Package parse 解析SQL语法,将待执行的SQL语句解析成数据存储引擎可操作的执行选择器,并为该执行选择器分配一个ID。
pool Package pool 负责监听对客户端的各种请求,接收请求,转发请求到目标模块。
runner