daShangDao_kfzgw-info/es/esDll.go
2025-12-31 17:56:22 +08:00

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)
//}