Compare commits

...

6 Commits
v0.0.1 ... main

Author SHA1 Message Date
Star
12fcb95b9d add querya 2025-01-14 14:28:26 +08:00
7eee72b053 fix nil bug for query11
add query1s query1a
2024-12-15 19:22:13 +08:00
183beb1286 add table _deleted for make db 2024-12-13 19:34:51 +08:00
Star
cc8c502ec0 support makeER 2024-11-22 16:36:11 +08:00
9cd64d91d0 add SetSSKey
add makeInKeys
2024-10-27 00:36:18 +08:00
a527592867 fix default db bug 2024-10-26 23:32:08 +08:00
4 changed files with 153 additions and 59 deletions

81
db.go
View File

@ -16,6 +16,7 @@ var dbTS string
//go:embed README.md
var dbMD string
var defaultDB = "default"
func init() {
obj := map[string]any{
@ -26,7 +27,8 @@ func init() {
},
"setDefault": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args := gojs.MakeArgs(&argsIn, vm).Check(1)
conn := db.GetDB(args.Str(0), args.Logger)
defaultDB = args.Str(0)
conn := db.GetDB(defaultDB, args.Logger)
args.This.ToObject(vm).Set("conn", conn)
return nil
},
@ -34,7 +36,7 @@ func init() {
gojs.Register("apigo.cc/gojs/db", gojs.Module{
ObjectMaker: func(vm *goja.Runtime) gojs.Map {
conn := db.GetDB("default", gojs.GetLogger(vm))
conn := db.GetDB(defaultDB, gojs.GetLogger(vm))
dbObj := makeDBObject(conn, nil)
for k, v := range obj {
dbObj[k] = v
@ -44,6 +46,9 @@ func init() {
Desc: "db api by github.com/ssgo/db",
TsCode: dbTS,
Example: dbMD,
SetSSKey: func(key, iv []byte) {
db.SetEncryptKeys(key, iv)
},
})
}
@ -65,6 +70,20 @@ func makeDBObject(conn *db.DB, tx *db.Tx) map[string]any {
panic(vm.NewGoError(r.Error))
}
},
"querya": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args, conn, tx, _ := initDBArgs(argsIn, vm, 1)
var r *db.QueryResult
if tx != nil {
r = tx.Query(args.Str(0), args.Array(1)...)
} else {
r = conn.Query(args.Str(0), args.Array(1)...)
}
if r.Error == nil {
return vm.ToValue(makeQueryResult(r, r.SliceResults()))
} else {
panic(vm.NewGoError(r.Error))
}
},
"query1": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args, conn, tx, _ := initDBArgs(argsIn, vm, 1)
var r *db.QueryResult
@ -79,6 +98,28 @@ func makeDBObject(conn *db.DB, tx *db.Tx) map[string]any {
panic(vm.NewGoError(r.Error))
}
},
"query1a": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args, conn, tx, _ := initDBArgs(argsIn, vm, 1)
var r *db.QueryResult
if tx != nil {
r = tx.Query(args.Str(0), args.Array(1)...)
} else {
r = conn.Query(args.Str(0), args.Array(1)...)
}
if r.Error == nil {
a := r.SliceResults()
if len(a) > 0 && len(a[0]) > 0 {
list := make([]any, len(a))
for i := 0; i < len(a); i++ {
list[i] = a[i][0]
}
return vm.ToValue(makeQueryResult(r, list))
}
return vm.ToValue(makeQueryResult(r, nil))
} else {
panic(vm.NewGoError(r.Error))
}
},
"query11": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args, conn, tx, _ := initDBArgs(argsIn, vm, 1)
var r *db.QueryResult
@ -92,7 +133,7 @@ func makeDBObject(conn *db.DB, tx *db.Tx) map[string]any {
if len(a) > 0 && len(a[0]) > 0 {
return vm.ToValue(makeQueryResult(r, a[0][0]))
}
return vm.ToValue(nil)
return vm.ToValue(makeQueryResult(r, nil))
} else {
panic(vm.NewGoError(r.Error))
}
@ -167,23 +208,47 @@ func makeDBObject(conn *db.DB, tx *db.Tx) map[string]any {
panic(vm.NewGoError(r.Error))
}
},
"makeInKeys": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args := gojs.MakeArgs(&argsIn, vm).Check(1)
return vm.ToValue(db.InKeys(args.Int(0)))
},
}
if conn != nil {
if tx == nil {
obj["make"] = func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args, conn, _, logger := initDBArgs(argsIn, vm, 1)
arg0 := args.Str(0)
tryFile := gojs.FindPath(vm, arg0)
erDesc := args.Str(0)
tryFile := gojs.FindPath(vm, erDesc)
if u.FileExists(tryFile) {
arg0 = u.ReadFileN(tryFile)
erDesc = u.ReadFileN(tryFile)
}
if err := dao.MakeDBFromDesc(conn, args.Str(0), logger); err == nil {
if err := dao.MakeDBFromDesc(conn, erDesc+`
_deleted
table v30 PK
id v30 PK
time dt ct
owner v30 I
data t
`, logger); err == nil {
return nil
} else {
panic(vm.NewGoError(err))
}
}
obj["makeER"] = func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args, _, _, logger := initDBArgs(argsIn, vm, 1)
outputFile := args.Str(0)
erDesc := args.Str(1)
tryFile := gojs.FindPath(vm, erDesc)
if u.FileExists(tryFile) {
erDesc = u.ReadFileN(tryFile)
}
dao.MakeERFile(erDesc, "", outputFile, logger)
return nil
}
obj["destroy"] = func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
_, conn, _, _ := initDBArgs(argsIn, vm, 0)
if err := conn.Destroy(); err == nil {

95
db.ts
View File

@ -4,8 +4,10 @@ export default {
get,
setDefault,
make,
makeER,
query,
query1,
query1a,
query11,
exec,
insert,
@ -14,69 +16,90 @@ export default {
delete: delete_,
destroy,
begin,
makeInKeys,
}
function get(dbName: string): DB {return null as any}
function setDefault(dbName: string): void {}
function make(descFileOrContent: string): Array<Object>{return null as any}
function query(sql: string, ...args:any): QueryResult{return null as any}
function query1(sql: string, ...args:any): QueryResult1{return null as any}
function query11(sql: string, ...args:any): QueryResult11{return null as any}
function exec(sql: string, ...args:any): ExecResult{return null as any}
function insert(table: string, data:Object): ExecResult{return null as any}
function replace(table: string, data:Object): ExecResult{return null as any}
function update(table: string, data:Object, where: string, ...args:any): ExecResult{return null as any}
function delete_(table: string, where: string, ...args:any): ExecResult{return null as any}
function destroy(): void{}
function begin(): Tx{return null as any}
function get(dbName: string): DB { return null as any }
function setDefault(dbName: string): void { }
function make(descFileOrContent: string): Object[] { return null as any }
function makeER(outputFile: string, descFileOrContent: string): void { }
function query(sql: string, ...args: any): QueryResult { return null as any }
function querya(sql: string, ...args: any): QueryResultA { return null as any }
function query1(sql: string, ...args: any): QueryResult1 { return null as any }
function query1a(sql: string, ...args: any): QueryResult1A { return null as any }
function query11(sql: string, ...args: any): QueryResult11 { return null as any }
function exec(sql: string, ...args: any): ExecResult { return null as any }
function insert(table: string, data: Object): ExecResult { return null as any }
function replace(table: string, data: Object): ExecResult { return null as any }
function update(table: string, data: Object, where: string, ...args: any): ExecResult { return null as any }
function delete_(table: string, where: string, ...args: any): ExecResult { return null as any }
function destroy(): void { }
function begin(): Tx { return null as any }
function makeInKeys(numKeys: number): string { return '' }
interface DB {
make(descFileOrContent: string): Array<Object>
query(sql: string, ...args:any): QueryResult
query1(sql: string, ...args:any): QueryResult1
query11(sql: string, ...args:any): QueryResult11
exec(sql: string, ...args:any): ExecResult
insert(table: string, data:Object): ExecResult
replace(table: string, data:Object): ExecResult
update(table: string, data:Object, where: string, ...args:any): ExecResult
delete(table: string, where: string, ...args:any): ExecResult
make(descFileOrContent: string): Object[]
query(sql: string, ...args: any): QueryResult
query1(sql: string, ...args: any): QueryResult1
query1a(sql: string, ...args: any): QueryResult1A
query11(sql: string, ...args: any): QueryResult11
exec(sql: string, ...args: any): ExecResult
insert(table: string, data: Object): ExecResult
replace(table: string, data: Object): ExecResult
update(table: string, data: Object, where: string, ...args: any): ExecResult
delete(table: string, where: string, ...args: any): ExecResult
destroy(): void
begin(): Tx
makeInKeys(numKeys: number): string
}
interface Tx {
query(sql: string, ...args:any): QueryResult
query1(sql: string, ...args:any): QueryResult1
query11(sql: string, ...args:any): QueryResult11
exec(sql: string, ...args:any): ExecResult
insert(table: string, data:Object): ExecResult
replace(table: string, data:Object): ExecResult
update(table: string, data:Object, where: string, ...args:any): ExecResult
delete(table: string, where: string, ...args:any): ExecResult
end(ok:boolean): void
query(sql: string, ...args: any): QueryResult
query1(sql: string, ...args: any): QueryResult1
query1a(sql: string, ...args: any): QueryResult1A
query11(sql: string, ...args: any): QueryResult11
exec(sql: string, ...args: any): ExecResult
insert(table: string, data: Object): ExecResult
replace(table: string, data: Object): ExecResult
update(table: string, data: Object, where: string, ...args: any): ExecResult
delete(table: string, where: string, ...args: any): ExecResult
end(ok: boolean): void
makeInKeys(numKeys: number): string
}
interface QueryResult {
sql: string
args: Array<any>
result: Array<Object>
args: any[]
result: Object[]
}
interface QueryResultA {
sql: string
args: any[]
result: any[][]
}
interface QueryResult1 {
sql: string
args: Array<any>
args: any[]
result: Object
}
interface QueryResult1A {
sql: string
args: any[]
result: any[]
}
interface QueryResult11 {
sql: string
args: Array<any>
args: any[]
result: any
}
interface ExecResult {
sql: string
args: Array<any>
args: any[]
id: number
changes: number
}

View File

@ -1,13 +1,19 @@
import db from 'apigo.cc/gojs/db'
function main(testUserName){
function main(testUserName) {
db.setDefault('sqlite://test.db')
db.make(`
User
User // {api} {select:isValid=1}
id i AI
name t
name v100 // [i]
password v100 // [p] {-}
age i // [n]
sex v10 // [s:Female,Male]
memo t // [t]
isValid b // [c]
version ubi //
`)
db.insert('User', {name: testUserName})
db.insert('User', { name: testUserName })
let user = db.query1('SELECT * FROM User').result
return user
}

22
go.mod
View File

@ -1,21 +1,21 @@
module apigo.cc/gojs/db
go 1.18
go 1.21
require (
apigo.cc/gojs v0.0.1
github.com/ssgo/dao v0.1.5
github.com/ssgo/db v1.7.9
apigo.cc/gojs v0.0.12
github.com/ssgo/dao v0.1.7
github.com/ssgo/db v1.7.11
github.com/ssgo/log v1.7.7
github.com/ssgo/u v1.7.9
modernc.org/sqlite v1.33.1
github.com/ssgo/u v1.7.13
modernc.org/sqlite v1.34.4
)
require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/dlclark/regexp2 v1.11.4 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/fsnotify/fsnotify v1.8.0 // indirect
github.com/go-sourcemap/sourcemap v2.1.4+incompatible // indirect
github.com/go-sql-driver/mysql v1.8.1 // indirect
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd // indirect
@ -25,11 +25,11 @@ require (
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/ssgo/config v1.7.7 // indirect
github.com/ssgo/config v1.7.9 // indirect
github.com/ssgo/standard v1.7.7 // indirect
github.com/ssgo/tool v0.4.27 // indirect
golang.org/x/sys v0.26.0 // indirect
golang.org/x/text v0.19.0 // indirect
github.com/ssgo/tool v0.4.28 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect
modernc.org/libc v1.55.3 // indirect