Skip to content

Commit db3abd0

Browse files
committed
feat: 为部分内容添加啊多线程优化 引入加密机制
1 parent 87fb44a commit db3abd0

File tree

9 files changed

+277
-48
lines changed

9 files changed

+277
-48
lines changed

README.md

-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,5 @@
1414
TODO:
1515

1616
基于RSA或者AES的数据库加密
17-
多线程优化
1817
基于Go的网络接口服务 可以通过Java与Spring进行对接的库(下次也不一定)
1918

core/core.go

+7-5
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ import (
1212
"github.com/HowXu/gosql/util"
1313
)
1414

15-
var Version string = "1.0-gamma"
15+
var Version string = "1.1"
16+
var plainText = "56We55qE5L2O6K+t"
1617

1718
func Init() {
1819
bptree.GLOBAL_DEBUG = false
19-
debug.LogLevel = 0
20+
debug.LogLevel = 1
2021
//log目录
2122
util.Create_Folder("./log")
2223
//log file
@@ -41,10 +42,11 @@ func Init() {
4142
LockFilWriter = bufio.NewWriter(lockfile)
4243

4344
//最基本的user表,权限表
44-
//新建数据库
45-
Create_Database("information_schema","root")
45+
//新建数据库 注意这里是有问题的 没有两个表文件是不可能创建数据库的
46+
util.Create_Folder("./db/information_schema")
47+
//Create_Database("information_schema","root")
48+
//只能使用原始IO
4649
//新建表
47-
4850
Create_Table_No_Map("root","information_schema", "user",[]string{"username","string","password","string"})
4951
Create_Table_No_Map("root","information_schema", "permission", []string{"user","string","permits","string[]"})
5052
//Insert之前进行读取判断防止重复

core/crypt.go

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package core
2+
3+
import (
4+
//"github.com/deatil/go-cryptobin/cryptobin/crypto"
5+
)
6+
7+
//TODO 加密
8+
9+
// AES加密
10+
func EncryptAES(plainText string, key string, cn chan string) error {
11+
12+
// 使用AES-CBC模式和PKCS7填充加密
13+
// cn <- crypto.
14+
// FromString(plainText).
15+
// SetKey(key).
16+
// Aes().
17+
// ECB().
18+
// PKCS7Padding().
19+
// Encrypt().
20+
// ToBase64String()
21+
cn <- plainText
22+
return nil
23+
}
24+
25+
// AES解密
26+
func DecryptAES(encryptText string, key string, cn chan string) error {
27+
// cn <- crypto.
28+
// FromBase64String(encryptText).
29+
// SetKey(key).
30+
// Aes().
31+
// ECB().
32+
// PKCS7Padding().
33+
// Decrypt().
34+
// ToString()
35+
cn <- encryptText
36+
return nil
37+
}

core/sql.go

+145-28
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"io"
88
"os"
9+
"path"
910
"strconv"
1011
"strings"
1112

@@ -68,7 +69,15 @@ func paser_low(database string, table string) (map[string]*bptree.Tree, []string
6869
}
6970

7071
//types_parsed = strings.Split(string(types), "|")
71-
data_parsed = strings.Split(string(data), "|")
72+
//解密部分
73+
var cn = make(chan string)
74+
go DecryptAES(string(data), plainText, cn)
75+
var o_cn = <-cn
76+
if o_cn == "" {
77+
return trees, data_parsed, log.ALL_ERR("Decode failed")
78+
}
79+
80+
data_parsed = strings.Split(o_cn, "|")
7281
//解析头 为每个头创建树
7382

7483
for i := 0; i < len(data_parsed); i++ {
@@ -81,14 +90,22 @@ func paser_low(database string, table string) (map[string]*bptree.Tree, []string
8190
for {
8291
//读取下一行
8392
var data_line, _, err_tr = table_reader.ReadLine()
93+
8494
if err_tr != nil {
8595
if err_tr == io.EOF {
8696
log.STDLOG("Read table finish", table)
8797
break
8898
}
8999
}
90100

91-
var data_parsed_line []string = strings.Split(string(data_line), "|")
101+
var cn = make(chan string)
102+
go DecryptAES(string(data_line), plainText, cn)
103+
var o_cn = <-cn
104+
if o_cn == "" {
105+
return trees, data_parsed, log.ALL_ERR("Decode failed")
106+
}
107+
108+
var data_parsed_line []string = strings.Split(o_cn, "|")
92109
//fmt.Printf("len(trees): %v\n", len(trees))
93110
//fmt.Printf("len(data_parsed_line): %v\n", len(data_parsed_line))
94111
//fmt.Printf("len(data_parsed): %v\n", len(data_parsed))
@@ -130,19 +147,34 @@ func match(database string, table string, condition map[string]any, usage string
130147
defer table_file.Close()
131148

132149
var reader = bufio.NewReader(table_file)
133-
//空读取第一行
150+
//读取第一行
134151
var keys, _, err_key = reader.ReadLine()
135152
if err_key != nil {
136153
return table_path, end_target, keys_parsed, types_parsed, tree, log.ALL_ATA_ERR("Read data type failed", usage)
137154
}
138-
keys_parsed = strings.Split(string(keys), "|")
155+
156+
var cn = make(chan string)
157+
go DecryptAES(string(keys), plainText, cn)
158+
var o_cn = <-cn
159+
if o_cn == "" {
160+
return table_path, end_target, keys_parsed, types_parsed, tree, log.ALL_ATA_ERR("Decode data failed", usage)
161+
}
162+
163+
keys_parsed = strings.Split(o_cn, "|")
139164
//读取第二行获取数据类型
140165
//这里支持的有string int float boolean string[]
141166
var types, _, err_rd = reader.ReadLine()
142167
if err_rd != nil {
143168
return table_path, end_target, keys_parsed, types_parsed, tree, log.ALL_ATA_ERR("Read data type failed", usage)
144169
}
145-
types_parsed = strings.Split(string(types), "|")
170+
171+
var cn2 = make(chan string)
172+
go DecryptAES(string(types), plainText, cn2)
173+
var o_cn2 = <- cn2
174+
if o_cn2 == "" {
175+
return table_path, end_target, keys_parsed, types_parsed, tree, log.ALL_ATA_ERR("Decode data failed", usage)
176+
}
177+
types_parsed = strings.Split(o_cn2, "|")
146178

147179
if len(keys_parsed) == 0 || len(types_parsed) == 0 {
148180
return table_path, end_target, keys_parsed, types_parsed, tree, log.ALL_ATA_ERR("Zero kyes or types", usage)
@@ -418,7 +450,15 @@ func Insert(database string, table string, data []string) error {
418450
if err_rd != nil {
419451
return log.ALL_ERR("Read data type failed")
420452
}
421-
var types_parsed = strings.Split(string(types), "|")
453+
454+
var cn3 = make(chan string)
455+
go DecryptAES(string(types), plainText, cn3)
456+
var o_cn3 = <-cn3
457+
if o_cn3 == "" {
458+
return log.ALL_ERR("Decode data failed")
459+
}
460+
461+
var types_parsed = strings.Split(o_cn3, "|")
422462
//现在构造新的字符串插入到文件末尾
423463
var input []string
424464
var index int = 0
@@ -477,7 +517,13 @@ func Insert(database string, table string, data []string) error {
477517
}
478518
defer w_table_file.Close()
479519
var writer = bufio.NewWriter(w_table_file)
480-
writer.WriteString(strings.Join(input, "|") + "\n")
520+
var cn = make(chan string)
521+
go EncryptAES(strings.Join(input, "|"), plainText, cn)
522+
var o_cn = <-cn
523+
if o_cn == "" {
524+
return log.ALL_ERR("Encode failed")
525+
}
526+
writer.WriteString(o_cn + "\n")
481527
return writer.Flush()
482528
}
483529

@@ -515,9 +561,21 @@ func Update(database string, table string, condition map[string]any, data map[st
515561
//用缓冲区我只能说性能更下一层楼
516562
var writer = bufio.NewWriter(file)
517563
//先把头和数据类型读进去
518-
writer.WriteString(strings.Join(keys_parsed, "|") + "\n")
564+
var cn = make(chan string)
565+
go EncryptAES(strings.Join(keys_parsed, "|"), plainText, cn)
566+
var o_cn = <-cn
567+
if o_cn == "" {
568+
return log.ALL_ERR("Encode failed")
569+
}
570+
writer.WriteString(o_cn + "\n")
519571
//fmt.Printf("keys_parsed: %v\n", keys_parsed)
520-
writer.WriteString(strings.Join(types_parsed, "|") + "\n")
572+
var cn2 = make(chan string)
573+
go EncryptAES(strings.Join(types_parsed, "|"), plainText, cn2)
574+
var o_cn2 = <-cn2
575+
if o_cn2 == "" {
576+
return log.ALL_ERR("Encode failed")
577+
}
578+
writer.WriteString(o_cn2 + "\n")
521579
var line_index int = 0
522580
for _, index := range end_target {
523581
var result []string
@@ -604,7 +662,13 @@ func Update(database string, table string, condition map[string]any, data map[st
604662
//推进ReadLine函数
605663
if line_index == index {
606664
//对应行 则写入不同数据
607-
writer.WriteString(strings.Join(result, "|") + "\n")
665+
var cn = make(chan string)
666+
go EncryptAES(strings.Join(result, "|"), plainText, cn)
667+
var o_cn = <-cn
668+
if o_cn == "" {
669+
return log.ALL_ERR("Encode failed")
670+
}
671+
writer.WriteString(o_cn + "\n")
608672
//补上空读一行
609673
reader.ReadLine()
610674
line_index++
@@ -672,8 +736,21 @@ func Delete(database string, table string, condition map[string]any, is_arc bool
672736
//用缓冲区我只能说性能更下一层楼
673737
var writer = bufio.NewWriter(file)
674738
//先把头和数据类型读进去
675-
writer.WriteString(strings.Join(keys_parsed, "|") + "\n")
676-
writer.WriteString(strings.Join(types_parsed, "|") + "\n")
739+
var cn = make(chan string)
740+
go EncryptAES(strings.Join(keys_parsed, "|"), plainText, cn)
741+
var o_cn = <-cn
742+
if o_cn == "" {
743+
return log.ALL_ERR("Encode failed")
744+
}
745+
writer.WriteString(o_cn + "\n")
746+
//fmt.Printf("keys_parsed: %v\n", keys_parsed)
747+
var cn2 = make(chan string)
748+
go EncryptAES(strings.Join(types_parsed, "|"), plainText, cn2)
749+
var o_cn2 = <-cn2
750+
if o_cn2 == "" {
751+
return log.ALL_ERR("Encode failed")
752+
}
753+
writer.WriteString(o_cn2 + "\n")
677754

678755
var line_index int = 0
679756
for _, index := range end_target {
@@ -782,8 +859,7 @@ func Create_Database(database string, user string) error {
782859
if se_err_r != nil {
783860
return log.Runtime_log_err(&err.DatabaseError{Msg: "Can't select from permission when create database"})
784861
}
785-
var getss_r []string
786-
getss_r = (strings.Split(gets_r[0][0], ","))
862+
var getss_r = (strings.Split(gets_r[0][0], ","))
787863
var data_r = make(map[string]any)
788864
data_r["permits"] = strings.Join(append(getss_r, database+".*"), ",")
789865
Get_Access("information_schema", "permission")
@@ -880,7 +956,7 @@ func Create_Table_No_Map(user string, database string, table string, head []stri
880956
}
881957

882958
var cn = make(chan bool)
883-
go PermissionCheck(user, database,cn)
959+
go PermissionCheck(user, database, cn)
884960
//true说明允许创建表
885961
if !<-cn {
886962
return &err.DatabaseError{Msg: "Permission delined when create table"}
@@ -893,7 +969,8 @@ func Create_Table_No_Map(user string, database string, table string, head []stri
893969
// 请确保调用该函数时head长度为2的倍数
894970
func create_table_User_No_Map(database string, table string, head []string) error {
895971
//传入应该有表头
896-
var table_path = fmt.Sprintf("./db/%s/%s.table", database, table)
972+
973+
var table_path = path.Join("db", database, table+".table") //fmt.Sprintf("./db/%s/%s.table", database, table)
897974
if len(head) == 0 {
898975
return log.ALL_ERR("Empty table head")
899976
}
@@ -925,11 +1002,25 @@ func create_table_User_No_Map(database string, table string, head []string) erro
9251002
types = append(types, head[i+1])
9261003
}
9271004

928-
fmt.Printf("heads: %v\n", heads)
929-
fmt.Printf("types: %v\n", types)
1005+
//fmt.Printf("heads: %v\n", heads)
1006+
//fmt.Printf("types: %v\n", types)
1007+
//先把头和数据类型读进去
1008+
var cn = make(chan string)
1009+
go EncryptAES(strings.Join(heads, "|"), plainText, cn)
1010+
var o_cn = <- cn
1011+
if o_cn == "" {
1012+
return log.ALL_ERR("Encode failed")
1013+
}
1014+
//fmt.Printf("keys_parsed: %v\n", keys_parsed)
1015+
var cn2 = make(chan string)
1016+
go EncryptAES(strings.Join(types, "|"), plainText, cn2)
1017+
var o_cn2 = <-cn2
1018+
if o_cn2 == "" {
1019+
return log.ALL_ERR("Encode failed")
1020+
}
9301021

931-
var heads_output = strings.Join(heads, "|") + "\n"
932-
var types_output = strings.Join(types, "|") + "\n"
1022+
var heads_output = o_cn + "\n"
1023+
var types_output = o_cn2 + "\n"
9331024
//写入文件
9341025
var _, err_r = writer.WriteString(heads_output)
9351026
if err_r != nil {
@@ -953,7 +1044,7 @@ func Create_Table(user string, database string, table string, head map[string]st
9531044
}
9541045

9551046
var cn = make(chan bool)
956-
go PermissionCheck(user, database,cn)
1047+
go PermissionCheck(user, database, cn)
9571048
//true说明允许创建表
9581049
if !<-cn {
9591050
return &err.DatabaseError{Msg: "Permission delined when create table"}
@@ -996,11 +1087,24 @@ func create_table_User(database string, table string, head map[string]string) er
9961087
types = append(types, value)
9971088
}
9981089

999-
fmt.Printf("heads: %v\n", heads)
1000-
fmt.Printf("types: %v\n", types)
1090+
//fmt.Printf("heads: %v\n", heads)
1091+
//fmt.Printf("types: %v\n", types)
1092+
var cn = make(chan string)
1093+
go EncryptAES(strings.Join(heads, "|"), plainText, cn)
1094+
var o_cn = <-cn
1095+
if o_cn == "" {
1096+
return log.ALL_ERR("Encode failed")
1097+
}
1098+
//fmt.Printf("keys_parsed: %v\n", keys_parsed)
1099+
var cn2 = make(chan string)
1100+
go EncryptAES(strings.Join(types, "|"), plainText, cn2)
1101+
var o_cn2 = <-cn2
1102+
if o_cn2 == "" {
1103+
return log.ALL_ERR("Encode failed")
1104+
}
10011105

1002-
var heads_output = strings.Join(heads, "|") + "\n"
1003-
var types_output = strings.Join(types, "|") + "\n"
1106+
var heads_output = o_cn + "\n"
1107+
var types_output = o_cn2 + "\n"
10041108
//写入文件
10051109
var _, err_r = writer.WriteString(heads_output)
10061110
if err_r != nil {
@@ -1043,8 +1147,14 @@ func GetAllTypes(database string, table string) ([]string, error) {
10431147
if err_rd != nil {
10441148
return types_parsed, log.ALL_ERR("Read data type failed")
10451149
}
1150+
var cn = make(chan string)
1151+
go DecryptAES(string(types), plainText, cn)
1152+
var o_cn = <-cn
1153+
if o_cn == "" {
1154+
return types_parsed, log.ALL_ERR("Encode failed")
1155+
}
10461156

1047-
types_parsed = strings.Split(string(types), "|")
1157+
types_parsed = strings.Split(o_cn, "|")
10481158
return types_parsed, nil
10491159
}
10501160

@@ -1070,11 +1180,18 @@ func GetAllKeys(database string, table string) ([]string, error) {
10701180

10711181
var reader = bufio.NewReader(table_file)
10721182

1073-
var types, _, err_rd = reader.ReadLine()
1183+
var keys, _, err_rd = reader.ReadLine()
10741184
if err_rd != nil {
10751185
return keys_parsed, log.ALL_ERR("Read keys failed")
10761186
}
10771187

1078-
keys_parsed = strings.Split(string(types), "|")
1188+
var cn = make(chan string)
1189+
go DecryptAES(string(keys), plainText, cn)
1190+
var o_cn = <-cn
1191+
if o_cn == "" {
1192+
return keys_parsed, log.ALL_ERR("Encode failed")
1193+
}
1194+
1195+
keys_parsed = strings.Split(o_cn, "|")
10791196
return keys_parsed, nil
10801197
}

0 commit comments

Comments
 (0)