goBlockchainDataAnalysis/mongoOperations.go
mongoOperations.goRaw
1package main
2
3import (
4 "encoding/json"
5 "fmt"
6 "io/ioutil"
7 "log"
8
9 mgo "gopkg.in/mgo.v2"
10 "gopkg.in/mgo.v2/bson"
11)
12
13//MongoConfig stores the configuration of mongodb to connect
14type MongoConfig struct {
15 IP string `json:"ip"`
16 Database string `json:"database"`
17}
18
19var mongoConfig MongoConfig
20
21func readMongodbConfig(path string) {
22 file, e := ioutil.ReadFile(path)
23 if e != nil {
24 fmt.Println("error:", e)
25 }
26 content := string(file)
27 json.Unmarshal([]byte(content), &mongoConfig)
28}
29
30func getSession() (*mgo.Session, error) {
31 session, err := mgo.Dial("mongodb://" + mongoConfig.IP)
32 if err != nil {
33 panic(err)
34 }
35 //defer session.Close()
36
37 // Optional. Switch the session to a monotonic behavior.
38 session.SetMode(mgo.Monotonic, true)
39
40 // Optional. Switch the session to a monotonic behavior.
41 session.SetMode(mgo.Monotonic, true)
42
43 return session, err
44}
45func getCollection(session *mgo.Session, collection string) *mgo.Collection {
46
47 c := session.DB(mongoConfig.Database).C(collection)
48 return c
49}
50func saveBlock(c *mgo.Collection, block BlockModel) {
51 //first, check if the item already exists
52 result := BlockModel{}
53 err := c.Find(bson.M{"hash": block.Hash}).One(&result)
54 if err != nil {
55 //item not found, so let's add a new entry
56 err = c.Insert(block)
57 check(err)
58 } else {
59 err = c.Update(bson.M{"hash": block.Hash}, &block)
60 if err != nil {
61 log.Fatal(err)
62 }
63 }
64
65}
66
67func getAllNodes() ([]NodeModel, error) {
68 result := []NodeModel{}
69 iter := nodeCollection.Find(bson.M{}).Limit(10000).Iter()
70 err := iter.All(&result)
71 return result, err
72}
73
74func saveNode(c *mgo.Collection, node NodeModel) {
75 //first, check if the node already exists
76 result := NodeModel{}
77 err := c.Find(bson.M{"id": node.Id}).One(&result)
78 if err != nil {
79 //node not found, so let's add a new entry
80 err = c.Insert(node)
81 check(err)
82 } else {
83 /*err = c.Update(bson.M{"id": node.Id}, &node)
84 if err != nil {
85 log.Fatal(err)
86 }
87 */
88 }
89}
90
91func getAllEdges() ([]EdgeModel, error) {
92 result := []EdgeModel{}
93 iter := edgeCollection.Find(bson.M{}).Limit(10000).Iter()
94 err := iter.All(&result)
95 return result, err
96}
97func saveEdge(c *mgo.Collection, edge EdgeModel) {
98 //first, check if the edge already exists
99 result := EdgeModel{}
100 err := c.Find(bson.M{"txid": edge.Txid, "to": edge.To, "from": edge.From, "blockheight": edge.BlockHeight, "label": edge.Label}).One(&result)
101 if err != nil {
102 //edge not found, so let's add a new entry
103 err = c.Insert(edge)
104 check(err)
105 } else {
106 err = c.Update(bson.M{"txid": edge.Txid, "to": edge.To, "from": edge.From, "blockheight": edge.BlockHeight, "label": edge.Label}, &edge)
107 if err != nil {
108 log.Fatal(err)
109 }
110 }
111}
112
113func nodeInNodes(nodes []NodeModel, node NodeModel) bool {
114 for _, n := range nodes {
115 if n.Id == node.Id {
116 return true
117 }
118 }
119 return false
120}
121func edgeInEdges(edges []EdgeModel, edge EdgeModel) bool {
122 for _, e := range edges {
123 if e.From == edge.From && e.To == edge.To && e.Label == edge.Label && e.BlockHeight == edge.BlockHeight {
124 return true
125 }
126 }
127 return false
128}