cptable.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package rpcore
  2. import (
  3. "fmt"
  4. memdb "github.com/hashicorp/go-memdb"
  5. )
  6. const CPTABLE_NAME = "cpt"
  7. type ChildProcTable struct {
  8. db *memdb.MemDB
  9. }
  10. func NewChildProcTable() *ChildProcTable {
  11. scheme := &memdb.DBSchema{
  12. Tables: map[string]*memdb.TableSchema{
  13. CPTABLE_NAME: &memdb.TableSchema{
  14. Name: CPTABLE_NAME,
  15. Indexes: map[string]*memdb.IndexSchema{
  16. "id": &memdb.IndexSchema{
  17. Name: "id",
  18. AllowMissing: false,
  19. Unique: true,
  20. Indexer: &memdb.IntFieldIndex{Field: "ID"},
  21. },
  22. "name": &memdb.IndexSchema{
  23. Name: "name",
  24. AllowMissing: false,
  25. Unique: false,
  26. Indexer: &memdb.StringFieldIndex{Field: "Name"},
  27. },
  28. "is_daemon": &memdb.IndexSchema{
  29. Name: "is_daemon",
  30. AllowMissing: false,
  31. Unique: false,
  32. Indexer: &memdb.BoolFieldIndex{Field: "IsDaemon"},
  33. },
  34. "status": &memdb.IndexSchema{
  35. Name: "status",
  36. AllowMissing: false,
  37. Unique: false,
  38. Indexer: &memdb.IntFieldIndex{Field: "Status"},
  39. },
  40. "pid": &memdb.IndexSchema{
  41. Name: "pid",
  42. AllowMissing: false,
  43. Unique: false,
  44. Indexer: &memdb.IntFieldIndex{Field: "ProcessID"},
  45. },
  46. },
  47. },
  48. },
  49. }
  50. mdb, err := memdb.NewMemDB(scheme)
  51. if err != nil {
  52. panic(fmt.Errorf("failed init ChildProcTable: memdb error: %s", err))
  53. }
  54. t := &ChildProcTable{
  55. db: mdb,
  56. }
  57. return t
  58. }
  59. func (c *ChildProcTable) Add(item *ChildProcTableItem) error {
  60. txn := c.db.Txn(true)
  61. err := txn.Insert(CPTABLE_NAME, item)
  62. if err != nil {
  63. return fmt.Errorf("add cpitem failed: set: %s", err)
  64. }
  65. txn.Commit()
  66. return nil
  67. }
  68. func (c *ChildProcTable) GetByID(id int64) (*ChildProcTableItem, error) {
  69. txn := c.db.Txn(false)
  70. defer txn.Abort()
  71. raw, err := txn.First(CPTABLE_NAME, "id", id)
  72. if err != nil {
  73. return nil, fmt.Errorf("get cpitem failed: %s", err)
  74. }
  75. if raw == nil {
  76. return nil, fmt.Errorf("get cpitem failed: no such item")
  77. }
  78. return raw.(*ChildProcTableItem), nil
  79. }
  80. func (c *ChildProcTable) GetByName(name string) ([]*ChildProcTableItem, error) {
  81. txn := c.db.Txn(false)
  82. defer txn.Abort()
  83. it, err := txn.Get(CPTABLE_NAME, "name", name)
  84. if err != nil {
  85. return nil, fmt.Errorf("get cpitem failed: %s", err)
  86. }
  87. out := make([]*ChildProcTableItem, 0)
  88. for obj := it.Next(); obj != nil; obj = it.Next() {
  89. out = append(out, obj.(*ChildProcTableItem))
  90. }
  91. return out, nil
  92. }
  93. func (c *ChildProcTable) Delete(item *ChildProcTableItem) error {
  94. txn := c.db.Txn(true)
  95. err := txn.Delete(CPTABLE_NAME, item)
  96. if err != nil {
  97. return fmt.Errorf("delete cpitem failed: %s", err)
  98. }
  99. txn.Commit()
  100. return nil
  101. }
  102. func (c *ChildProcTable) GetByPID(pid int) ([]*ChildProcTableItem, error) {
  103. txn := c.db.Txn(false)
  104. defer txn.Abort()
  105. it, err := txn.Get(CPTABLE_NAME, "pid", pid)
  106. if err != nil {
  107. return nil, fmt.Errorf("get cpitem failed: %s", err)
  108. }
  109. out := make([]*ChildProcTableItem, 0)
  110. for obj := it.Next(); obj != nil; obj = it.Next() {
  111. out = append(out, obj.(*ChildProcTableItem))
  112. }
  113. return out, nil
  114. }
  115. func (c *ChildProcTable) ListAll() ([]*ChildProcTableItem, error) {
  116. txn := c.db.Txn(false)
  117. defer txn.Abort()
  118. it, err := txn.Get(CPTABLE_NAME, "id")
  119. if err != nil {
  120. return nil, fmt.Errorf("get items failed: %s", err)
  121. }
  122. out := make([]*ChildProcTableItem, 0)
  123. for obj := it.Next(); obj != nil; obj = it.Next() {
  124. out = append(out, obj.(*ChildProcTableItem))
  125. }
  126. return out, nil
  127. }
  128. func (c *ChildProcTable) DoQuery(index string, args ...interface{}) ([]*ChildProcTableItem, error) {
  129. txn := c.db.Txn(false)
  130. defer txn.Abort()
  131. it, err := txn.Get(CPTABLE_NAME, index, args...)
  132. if err != nil {
  133. return nil, fmt.Errorf("query items failed: %s", err)
  134. }
  135. out := make([]*ChildProcTableItem, 0)
  136. for obj := it.Next(); obj != nil; obj = it.Next() {
  137. out = append(out, obj.(*ChildProcTableItem))
  138. }
  139. return out, nil
  140. }