diff options
Diffstat (limited to 'listener/mongo.go')
-rw-r--r-- | listener/mongo.go | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/listener/mongo.go b/listener/mongo.go new file mode 100644 index 0000000..a51350e --- /dev/null +++ b/listener/mongo.go | |||
@@ -0,0 +1,122 @@ | |||
1 | package main | ||
2 | |||
3 | import ( | ||
4 | "context" | ||
5 | "fmt" | ||
6 | "reflect" | ||
7 | "time" | ||
8 | |||
9 | "go.mongodb.org/mongo-driver/bson" | ||
10 | "go.mongodb.org/mongo-driver/mongo" | ||
11 | "go.mongodb.org/mongo-driver/mongo/options" | ||
12 | ) | ||
13 | |||
14 | type mongoClient struct { | ||
15 | dbName, colName string | ||
16 | client *mongo.Client | ||
17 | col *mongo.Collection | ||
18 | } | ||
19 | |||
20 | func (mc *mongoClient) init(dbName, colName string) error { | ||
21 | var err error | ||
22 | if err = mc.Connect(dbName, colName); err != nil { | ||
23 | return err | ||
24 | } | ||
25 | if err = mc.Drop(); err != nil { | ||
26 | return err | ||
27 | } | ||
28 | |||
29 | return nil | ||
30 | } | ||
31 | |||
32 | func (mc *mongoClient) Connect(dbName, colName string) error { | ||
33 | var err error | ||
34 | mc.client, err = mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017")) | ||
35 | |||
36 | if err != nil { | ||
37 | return err | ||
38 | } | ||
39 | |||
40 | ctx, _ := context.WithTimeout(context.Background(), 10*time.Second) | ||
41 | err = mc.client.Connect(ctx) | ||
42 | if err != nil { | ||
43 | return err | ||
44 | } | ||
45 | |||
46 | mc.col = mc.client.Database(dbName).Collection(colName) | ||
47 | mc.dbName = dbName | ||
48 | mc.colName = colName | ||
49 | return nil | ||
50 | } | ||
51 | |||
52 | func (mc *mongoClient) InsertOne(document interface{}) error { | ||
53 | _, err := mc.col.InsertOne(context.Background(), document) | ||
54 | return err | ||
55 | } | ||
56 | |||
57 | func (mc *mongoClient) UpdateOne(filter, update interface{}) error { | ||
58 | _, err := mc.col.UpdateOne(context.Background(), filter, update) | ||
59 | return err | ||
60 | } | ||
61 | |||
62 | func (mc *mongoClient) UpdateMany(filter, update interface{}) error { | ||
63 | _, err := mc.col.UpdateMany(context.Background(), filter, update) | ||
64 | return err | ||
65 | } | ||
66 | |||
67 | func (mc *mongoClient) ReplaceOne(filter, new interface{}) error { | ||
68 | _, err := mc.col.ReplaceOne(context.Background(), filter, new) | ||
69 | return err | ||
70 | } | ||
71 | |||
72 | func (mc *mongoClient) Finddoc(filter bson.M, results interface{}) error { | ||
73 | sliceValue := reflect.ValueOf(results) | ||
74 | |||
75 | if sliceValue.Kind() != reflect.Ptr || sliceValue.Elem().Kind() != reflect.Slice { | ||
76 | return fmt.Errorf("Error: result argument must be pointer to slice") | ||
77 | } | ||
78 | cur, err := mc.col.Find(context.TODO(), filter) | ||
79 | if err != nil { | ||
80 | return err | ||
81 | } | ||
82 | defer cur.Close(context.TODO()) | ||
83 | |||
84 | elemType := sliceValue.Elem().Type().Elem() | ||
85 | |||
86 | sliceValue = sliceValue.Elem() | ||
87 | |||
88 | for cur.Next(context.TODO()) { | ||
89 | elem := reflect.New(elemType).Interface() | ||
90 | err := cur.Decode(elem) | ||
91 | if err != nil { | ||
92 | return err | ||
93 | } | ||
94 | sliceValue = reflect.Append(sliceValue, reflect.ValueOf(elem).Elem()) | ||
95 | } | ||
96 | |||
97 | reflect.ValueOf(results).Elem().Set(sliceValue) | ||
98 | return nil | ||
99 | } | ||
100 | |||
101 | func (mc *mongoClient) FindOneAndDelete(filter bson.M) (bson.M, error) { | ||
102 | res := mc.col.FindOneAndDelete(context.Background(), filter) | ||
103 | var result bson.M | ||
104 | err := res.Decode(&result) | ||
105 | return result, err | ||
106 | } | ||
107 | |||
108 | func (mc *mongoClient) Drop() error { | ||
109 | return mc.col.Drop(context.Background()) | ||
110 | } | ||
111 | |||
112 | func (mc *mongoClient) Disconnect() error { | ||
113 | err := mc.client.Disconnect(context.Background()) | ||
114 | if err != nil { | ||
115 | return err | ||
116 | } | ||
117 | mc.col = nil | ||
118 | mc.client = nil | ||
119 | mc.dbName = "" | ||
120 | mc.colName = "" | ||
121 | return nil | ||
122 | } | ||