38454b3b468319de03eaece5cf00e99b70279e59
2 from pymongo
import MongoClient
3 from dbbase
import DbException
, dbbase
4 from http
import HTTPStatus
11 def db_connect(self
, config
):
13 self
.client
= MongoClient(config
["host"], config
["port"])
14 self
.db
= self
.client
[config
["name"]]
15 # get data to try a connection
16 self
.db
.users
.find_one({"username": "admin"})
17 except Exception as e
: # TODO refine
18 raise DbException(str(e
))
20 def db_disconnect(self
):
24 def _format_filter(filter):
27 for query_k
, query_v
in filter.items():
28 dot_index
= query_k
.rfind(".")
29 if dot_index
> 1 and query_k
[dot_index
+1:] in ("eq", "ne", "gt", "gte", "lt", "lte", "cont",
31 operator
= "$" + query_k
[dot_index
+1:]
32 if operator
== "$neq":
34 k
= query_k
[:dot_index
]
40 if isinstance(v
, list):
41 if operator
in ("$eq", "$cont"):
44 elif operator
in ("$ne", "$ncont"):
50 if operator
in ("$eq", "$cont"):
51 # v cannot be a comma separated list, because operator would have been changed to $in
53 elif operator
== "$ncount":
54 # v cannot be a comma separated list, because operator would have been changed to $nin
55 db_filter
[k
] = {"$ne": v
}
57 # maybe db_filter[k] exist. e.g. in the query string for values between 5 and 8: "a.gt=5&a.lt=8"
58 if k
not in db_filter
:
60 db_filter
[k
][operator
] = v
63 except Exception as e
:
64 raise DbException("Invalid query string filter at {}:{}. Error: {}".format(query_k
, v
, e
),
65 http_code
=HTTPStatus
.BAD_REQUEST
.value
)
68 def get_list(self
, table
, filter={}):
71 collection
= self
.db
[table
]
72 rows
= collection
.find(self
._format
_filter
(filter))
78 except Exception as e
: # TODO refine
79 raise DbException(str(e
))
81 def get_one(self
, table
, filter={}, fail_on_empty
=True, fail_on_more
=True):
84 filter = self
._format
_filter
(filter)
85 collection
= self
.db
[table
]
86 if not (fail_on_empty
and fail_on_more
):
87 return collection
.find_one(filter)
88 rows
= collection
.find(filter)
91 raise DbException("Not found entry with filter='{}'".format(filter), HTTPStatus
.NOT_FOUND
.value
)
93 elif rows
.count() > 1:
95 raise DbException("Found more than one entry with filter='{}'".format(filter),
96 HTTPStatus
.CONFLICT
.value
)
98 except Exception as e
: # TODO refine
99 raise DbException(str(e
))
101 def del_list(self
, table
, filter={}):
103 collection
= self
.db
[table
]
104 rows
= collection
.delete_many(self
._format
_filter
(filter))
105 return {"deleted": rows
.deleted_count
}
108 except Exception as e
: # TODO refine
109 raise DbException(str(e
))
111 def del_one(self
, table
, filter={}, fail_on_empty
=True):
113 collection
= self
.db
[table
]
114 rows
= collection
.delete_one(self
._format
_filter
(filter))
115 if rows
.deleted_count
== 0:
117 raise DbException("Not found entry with filter='{}'".format(filter), HTTPStatus
.NOT_FOUND
.value
)
119 return {"deleted": rows
.deleted_count
}
120 except Exception as e
: # TODO refine
121 raise DbException(str(e
))
123 def create(self
, table
, indata
):
125 collection
= self
.db
[table
]
126 data
= collection
.insert_one(indata
)
127 return data
.inserted_id
128 except Exception as e
: # TODO refine
129 raise DbException(str(e
))
131 def set_one(self
, table
, filter, update_dict
, fail_on_empty
=True):
133 collection
= self
.db
[table
]
134 rows
= collection
.update_one(self
._format
_filter
(filter), {"$set": update_dict
})
135 if rows
.updated_count
== 0:
137 raise DbException("Not found entry with filter='{}'".format(filter), HTTPStatus
.NOT_FOUND
.value
)
139 return {"deleted": rows
.deleted_count
}
140 except Exception as e
: # TODO refine
141 raise DbException(str(e
))
143 def replace(self
, table
, id, indata
, fail_on_empty
=True):
145 collection
= self
.db
[table
]
146 rows
= collection
.replace_one({"_id": id}, indata
)
147 if rows
.modified_count
== 0:
149 raise DbException("Not found entry with filter='{}'".format(filter), HTTPStatus
.NOT_FOUND
.value
)
151 return {"replace": rows
.modified_count
}
152 except Exception as e
: # TODO refine
153 raise DbException(str(e
))