manager.go 920 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package plugin_manager
  2. import (
  3. "fmt"
  4. "github.com/emqx/kuiper/common"
  5. "path"
  6. "plugin"
  7. "unicode"
  8. )
  9. var registry map[string]plugin.Symbol
  10. func init() {
  11. registry = make(map[string]plugin.Symbol)
  12. }
  13. func GetPlugin(t string, ptype string) (plugin.Symbol, error) {
  14. t = ucFirst(t)
  15. key := ptype + "/" + t
  16. var nf plugin.Symbol
  17. nf, ok := registry[key]
  18. if !ok {
  19. loc, err := common.GetLoc("/plugins/")
  20. if err != nil {
  21. return nil, fmt.Errorf("cannot find the plugins folder")
  22. }
  23. mod := path.Join(loc, ptype, t+".so")
  24. plug, err := plugin.Open(mod)
  25. if err != nil {
  26. return nil, fmt.Errorf("cannot open %s: %v", mod, err)
  27. }
  28. nf, err = plug.Lookup(t)
  29. if err != nil {
  30. return nil, fmt.Errorf("cannot find symbol %s, please check if it is exported", t)
  31. }
  32. }
  33. return nf, nil
  34. }
  35. func ucFirst(str string) string {
  36. for i, v := range str {
  37. return string(unicode.ToUpper(v)) + str[i+1:]
  38. }
  39. return ""
  40. }