1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
import json
import sys
from datetime import datetime
from pymongo import MongoClient
from bson.json_util import loads, dumps, RELAXED_JSON_OPTIONS, CANONICAL_JSON_OPTIONS
import urllib.parse
#from mysql.connector.pooling import MySQLConnectionPool
# Get keys from config file
with open(sys.argv[1]) as f:
KEYS = json.load(f)
DATETIME_STRING_FORMAT = '%Y-%m-%dT%H:%M:%S'
CONNECTION_POOL = None
def init_connection_pool(user, password, database, host, port):
user = urllib.parse.quote_plus(user) #TODO: replace this with environment variable
password = urllib.parse.quote_plus(password) #TODO: same as above
database = urllib.parse.quote_plus(database)
host = urllib.parse.quote_plus(host)
global client
global opendcdb
global prefabs_collection
global user_collection
global topologies_collection
client = MongoClient('mongodb://%s:%s@%s/default_db?authSource=%s' % (user, password, host, database))
opendcdb = client.opendc
prefabs_collection = opendcdb.prefabs
topologies_collection = opendcdb.topologies
user_collection = opendcdb.users
#global CONNECTION_POOL
#CONNECTION_POOL = MySQLConnectionPool(pool_name="opendcpool", pool_size=5,
#user=user, password=password, database=database, host=host, port=port)
def execute(statement, t):
"""Open a database connection and execute the statement."""
# Connect to the database
connection = CONNECTION_POOL.get_connection()
cursor = connection.cursor()
# Execute the statement
cursor.execute(statement, t)
# Get the id
cursor.execute('SELECT last_insert_id();')
row_id = cursor.fetchone()[0]
# Disconnect from the database
connection.commit()
connection.close()
# Return the id
return row_id
def fetchone(statement, t=None):
"""Open a database connection and return the first row matched by the SELECT statement."""
# Connect to the database
connection = CONNECTION_POOL.get_connection()
cursor = connection.cursor()
# Execute the SELECT statement
if t is not None:
cursor.execute(statement, t)
else:
cursor.execute(statement)
value = cursor.fetchone()
# Disconnect from the database and return
connection.close()
return value
def fetchall(statement, t=None):
"""Open a database connection and return all rows matched by the SELECT statement."""
# Connect to the database
connection = CONNECTION_POOL.get_connection()
cursor = connection.cursor()
# Execute the SELECT statement
if t is not None:
cursor.execute(statement, t)
else:
cursor.execute(statement)
values = cursor.fetchall()
# Disconnect from the database and return
connection.close()
return values
def fetchone(query, collection):
"""Uses existing mongo connection to return a single (the first) document in a collection matching the given query as a JSON object"""
# query needs to be in json format, i.e.: {'name': prefab_name}
#TODO: determine which collection to pull from
bson = prefabs_collection.find_one(query)
json_string = dumps(bson) #convert BSON representation to JSON
json_obj = json.loads(json_string) #load as a JSON object
#leave the id field in for now, we can use it later
#json_obj.pop("_id")
return json_obj
def fetchall(query, collection):
"""Uses existing mongo connection to return all documents matching a given query, as a list of JSON objects"""
results = []
cursor = prefabs_collection.find(query)
for doc in cursor:
json_string = dumps(doc) #convert BSON representation to JSON
json_obj = json.loads(json_string) #load as a JSON object
#leave the id field in for now, we can use it later
#json_obj.pop("_id")
results.append(json_obj)
return results
def datetime_to_string(datetime_to_convert):
"""Return a database-compatible string representation of the given datetime object."""
return datetime_to_convert.strftime(DATETIME_STRING_FORMAT)
def string_to_datetime(string_to_convert):
"""Return a datetime corresponding to the given string representation."""
return datetime.strptime(string_to_convert, DATETIME_STRING_FORMAT)
|