This repository has been archived on 2024-11-02. You can view files and clone it, but cannot push or open issues or pull requests.
db-manager/src/mongo.py

143 lines
4.6 KiB
Python
Raw Normal View History

2023-02-11 15:16:25 +00:00
import os
from pymongo import MongoClient
import time, datetime
2023-02-11 15:16:25 +00:00
import urllib.parse
import logger as log
2023-02-11 22:05:30 +00:00
db_host = os.getenv('OWL_DB_HOST', 'localhost')
db_port = os.getenv('OWL_DB_PORT', 27017)
db_user = urllib.parse.quote_plus(os.getenv('OWL_DB_USER', "owl"))
db_pass = urllib.parse.quote_plus(os.getenv('OWL_DB_PASS', "twittwoo"))
db_name = os.getenv('OWL_DB_NAME', "owlboard")
log.out(f"mongo.py: Database URI: {db_host}:{db_port}", "DBUG")
2023-02-11 22:05:30 +00:00
client = MongoClient(f"mongodb://{db_user}:{db_pass}@{db_host}:{db_port}")
db = client[db_name]
log.out("mongo.py: Mongo module loaded", "DBUG")
2023-02-11 22:05:30 +00:00
def metaCheckTime(target):
col = db["meta"]
2023-02-12 20:03:20 +00:00
res = col.find_one({"target": target, "type": "collection"})
incrementCounter("meta")
2023-02-13 20:45:05 +00:00
if type(res) is dict:
if 'updated' in res:
readable_datetime = datetime.datetime.fromtimestamp(res["updated"])
log.out(f'mongo.metaUpdateTime: {target} last updated at {readable_datetime}', "INFO")
2023-02-12 21:36:41 +00:00
return res["updated"]
2023-05-31 19:04:33 +01:00
log.out(f'mongo.metaUpdatetime: {target} does not exist', "EROR")
2023-02-13 20:45:05 +00:00
return 0
2023-02-11 22:05:30 +00:00
def metaUpdateTime(target):
col = db["meta"]
2023-05-31 19:04:33 +01:00
log.out(f'mongo.metaUpdateTime: Updating updated time for {target}', "DBUG")
2023-02-12 20:03:20 +00:00
res = col.update_one({"target": target, "type":"collection"}, {"$set":{"updated": int(time.time()),"target":target, "type":"collection"}}, upsert=True)
incrementCounter("meta")
2023-02-11 22:05:30 +00:00
def getLength(collection):
col = db[collection]
incrementCounter(collection)
2023-02-11 22:05:30 +00:00
return col.count_documents({})
2023-02-12 20:53:59 +00:00
def createSingleIndex(collection, field):
col = db[collection]
col.create_index(field)
incrementCounter(collection)
2023-02-12 20:53:59 +00:00
log.out(f'mongo.createSingleIndex: Created index of {field} in {collection}', "INFO")
return
2023-05-08 19:55:09 +01:00
def createTtlIndex(collection, field, time):
col = db[collection]
col.create_index(field, expireAfterSeconds = time)
log.out(f'mongo.createTtlIndex: Created TTL Index of {field} in {collection} to expire after {time} seconds', "INFO")
def putMany(collection :str, data :list, indexed_fields :list = []):
log.out(f"mongo.putMany: Inserting many documents to: {collection}")
col = db[collection]
incrementCounter(collection)
col.insert_many(data)
metaUpdateTime(collection)
for item in indexed_fields:
createSingleIndex(collection, item)
2023-05-08 19:55:09 +01:00
def incrementCounter(target):
collection = "meta"
col = db[collection]
2023-02-16 22:17:35 +00:00
col.update_one({"target": "counters","type": "count"}, {"$inc":{target: 1}})
return
2023-02-12 21:36:41 +00:00
def metaCounters():
collection = "meta"
col = db[collection]
res = col.find_one({"target": "counters","type": "count"})
2023-02-13 20:45:05 +00:00
if type(res) is dict:
if 'since' in res:
2023-02-12 21:36:41 +00:00
log.out('mongo.metaCounters: counters already exists, skipping', "INFO")
2023-02-16 22:23:54 +00:00
incrementCounter(collection)
2023-02-13 20:45:05 +00:00
return
log.out('mongo.metaCounters: counters does not exist, creating', "INFO")
col.update_one({"target": "counters","type": "count"}, {"$set":{"target": "counters","type": "count","since": int(time.time())}}, upsert=True)
2023-02-16 22:23:54 +00:00
incrementCounter(collection)
return
def putVersion(version):
2023-03-13 20:10:20 +00:00
collection = "meta"
col = db[collection]
2023-03-13 20:10:20 +00:00
res = col.update_one({"target": "versions"}, {"$set":{"target": "versions","dbmanager": version}}, upsert=True)
2023-05-30 23:03:16 +01:00
return
def putTimetable(data):
2023-06-29 20:12:49 +01:00
data_length = len(data)
log.out(f"mongo.putTimetable: Adding {data_length} documents to the database")
2023-05-30 23:03:16 +01:00
collection = "timetable"
col = db[collection]
2023-05-31 19:04:33 +01:00
res = col.insert_many(data)
def dropCollection(collection):
log.out(f"mongo.dropCollection: Dropping collection '{collection}'")
2023-05-31 19:04:33 +01:00
col = db[collection]
res = col.drop()
def deleteTimetableData(query):
collection = "timetable"
col = db[collection]
2023-06-02 00:47:24 +01:00
log.out(f"mongo.deleteTimetableData: Deleting entry matching {query}")
res = col.delete_one(query)
def getMetaHash(target):
collection = "meta"
col = db[collection]
res = col.find_one({"target": target, "type": "collection"})
incrementCounter("meta")
if type(res) is dict:
if 'updated' in res:
try:
return res["hash"]
except:
return None
return None
def putMetaHash(target :str, hash :str):
collection = "meta"
col = db[collection]
filter = {
"target": target,
"type": "collection"
}
update = {
"target": target,
"type": "collection",
"hash": hash
}
2023-05-31 22:59:38 +01:00
res = col.update_one(filter, {"$set": update}, upsert=True)
def query(collection, query):
col = db[collection]
2023-05-31 23:09:31 +01:00
incrementCounter(collection)
2023-06-01 09:07:57 +01:00
return col.find_one(query)
def deleteMany(collection :str, filter :dict):
col = db[collection]
incrementCounter(collection)
return col.delete_many(filter)