134 lines
3.7 KiB
Go
134 lines
3.7 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
// EsDLL Elasticsearch工具DLL结构
|
|
type esDLL struct {
|
|
dll *syscall.DLL
|
|
listAllIndices *syscall.Proc // 查询所有索引
|
|
getIndicesInfo *syscall.Proc // 获取所有索引的详细信息
|
|
getIndexDetail *syscall.Proc // 获取单个索引的详细信息
|
|
createIndex *syscall.Proc // 创建索引
|
|
deleteIndex *syscall.Proc // 删除索引
|
|
getDocumentCount *syscall.Proc // 获取索引文档数量
|
|
createDocument *syscall.Proc // 创建文档
|
|
getDocument *syscall.Proc // 根据ID获取文档
|
|
updateDocument *syscall.Proc // 更新文档
|
|
deleteDocument *syscall.Proc // 删除文档
|
|
searchDocuments *syscall.Proc // 搜索文档
|
|
freeCString *syscall.Proc // 释放C字符串
|
|
}
|
|
|
|
// 初始化esDLL
|
|
func InitEsDLL() (*esDLL, error) {
|
|
dllPath := filepath.Join("es", "dll", "es.dll")
|
|
if _, err := os.Stat(dllPath); os.IsNotExist(err) {
|
|
return nil, fmt.Errorf("es DLL 不存在: %s", dllPath)
|
|
}
|
|
if dll, err := syscall.LoadDLL(dllPath); err != nil {
|
|
return nil, fmt.Errorf("加载es DLL 失败: %s", err)
|
|
} else {
|
|
return &esDLL{
|
|
dll: dll,
|
|
listAllIndices: dll.MustFindProc("ListAllIndices"),
|
|
getIndicesInfo: dll.MustFindProc("GetIndicesInfo"),
|
|
getIndexDetail: dll.MustFindProc("GetIndexDetail"),
|
|
createIndex: dll.MustFindProc("CreateIndex"),
|
|
deleteIndex: dll.MustFindProc("DeleteIndex"),
|
|
getDocumentCount: dll.MustFindProc("GetDocumentCount"),
|
|
createDocument: dll.MustFindProc("CreateDocument"),
|
|
getDocument: dll.MustFindProc("GetDocument"),
|
|
updateDocument: dll.MustFindProc("UpdateDocument"),
|
|
deleteDocument: dll.MustFindProc("DeleteDocument"),
|
|
searchDocuments: dll.MustFindProc("SearchDocuments"),
|
|
freeCString: dll.MustFindProc("FreeCString"),
|
|
}, nil
|
|
}
|
|
}
|
|
|
|
// cStr 获取C字符串
|
|
func (m *esDLL) cStr(p uintptr) string {
|
|
if p == 0 {
|
|
return ""
|
|
}
|
|
b := []byte{}
|
|
for i := uintptr(0); ; i++ {
|
|
c := *(*byte)(unsafe.Pointer(p + i))
|
|
if c == 0 {
|
|
break
|
|
}
|
|
b = append(b, c)
|
|
}
|
|
s := string(b)
|
|
if m.freeCString != nil {
|
|
m.freeCString.Call(p)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// 查询所有索引
|
|
func (m *esDLL) ListAllIndices() (string, error) {
|
|
proc, err := m.dll.FindProc("ListAllIndices")
|
|
if err != nil {
|
|
return "", fmt.Errorf("找不到函数 ListAllIndices: %v", err)
|
|
}
|
|
resultPtr, _, _ := proc.Call()
|
|
result := m.cStr(resultPtr)
|
|
return result, nil
|
|
}
|
|
|
|
func (m *esDLL) CreateDocument(indexName string, id string, doc interface{}) (string, error) {
|
|
proc, err := m.dll.FindProc("CreateDocument")
|
|
if err != nil {
|
|
return "", fmt.Errorf("找不到函数 CreateDocument: %v", err)
|
|
}
|
|
docJson, err := json.Marshal(doc)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
indexNamePtr, _ := syscall.BytePtrFromString(indexName)
|
|
idPtr, _ := syscall.BytePtrFromString(id)
|
|
docJsonPtr, _ := syscall.BytePtrFromString(string(docJson))
|
|
|
|
resultPtr, _, _ := proc.Call(
|
|
uintptr(unsafe.Pointer(indexNamePtr)),
|
|
uintptr(unsafe.Pointer(idPtr)),
|
|
uintptr(unsafe.Pointer(docJsonPtr)),
|
|
)
|
|
result := m.cStr(resultPtr)
|
|
return result, nil
|
|
}
|
|
|
|
//func main() {
|
|
// dll, err := InitEsDLL()
|
|
// if err != nil {
|
|
// fmt.Println(err)
|
|
// }
|
|
// //indices, err := dll.ListAllIndices()
|
|
// //if err != nil {
|
|
// // fmt.Println(err)
|
|
// //}
|
|
// //fmt.Println(string(indices))
|
|
//
|
|
// doc := Document{
|
|
// ID: "10003",
|
|
// Title: "测试文档3",
|
|
// Content: "这是一个测试文档3",
|
|
// Author: "测试员3",
|
|
// CreatedAt: time.Now(),
|
|
// Tags: []string{"测试3", "文档3"},
|
|
// }
|
|
// document, err := dll.CreateDocument("test-cc", doc.ID, doc)
|
|
// if err != nil {
|
|
// fmt.Println(err)
|
|
// }
|
|
// fmt.Println(document)
|
|
//}
|