summaryrefslogtreecommitdiff
path: root/opendc/util/database.py
blob: 20006ff2a6d744008a762f99675e6b72610059f4 (plain)
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)