First database cache test

This commit is contained in:
deathbybandaid 2019-05-22 10:32:36 -04:00
parent 00cbc16188
commit 66beaa969c
6 changed files with 252 additions and 88 deletions

View File

@ -0,0 +1,251 @@
# coding=utf8
from __future__ import unicode_literals, absolute_import, division, print_function
"""
This is the SpiceBot Database
"""
from sopel.tools import Identifier
import threading
class BotDatabase():
"""A thread safe database cache"""
def __init__(self):
self.lock = threading.Lock()
self.SpiceBot_Database = {
"nicks": {},
"channels": {},
}
"""Nick"""
def get_nick_value(self, bot, nick, key, sorting_key='unsorted'):
self.lock.acquire()
nick = Identifier(nick)
nick_id = bot.db.get_nick_id(nick, create=True)
if nick_id not in self.SpiceBot_Database["nicks"].keys():
self.SpiceBot_Database["nicks"][nick_id] = {}
if sorting_key not in self.SpiceBot_Database["nicks"][nick_id].keys():
self.SpiceBot_Database["nicks"][nick_id][sorting_key] = bot.db.get_nick_value(nick, sorting_key) or dict()
self.lock.release()
if key not in self.SpiceBot_Database["nicks"][nick_id][sorting_key].keys():
return None
else:
return self.SpiceBot_Database["nicks"][nick_id][sorting_key][key]
def set_nick_value(self, bot, nick, key, value, sorting_key='unsorted'):
self.lock.acquire()
nick = Identifier(nick)
nick_id = bot.db.get_nick_id(nick, create=True)
if nick_id not in self.SpiceBot_Database["nicks"].keys():
self.SpiceBot_Database["nicks"][nick_id] = {}
self.lock.release()
if sorting_key not in self.SpiceBot_Database["nicks"][nick_id].keys():
self.SpiceBot_Database["nicks"][nick_id][sorting_key] = bot.db.get_nick_value(nick, sorting_key) or dict()
self.lock.release()
self.SpiceBot_Database["nicks"][nick_id][sorting_key][key] = value
bot.db.set_nick_value(nick, sorting_key, self.SpiceBot_Database["nicks"][nick_id][sorting_key])
self.lock.release()
def delete_nick_value(self, bot, nick, key, sorting_key='unsorted'):
self.lock.acquire()
nick = Identifier(nick)
nick_id = bot.db.get_nick_id(nick, create=True)
if nick_id not in self.SpiceBot_Database["nicks"].keys():
self.SpiceBot_Database["nicks"][nick_id] = {}
if sorting_key not in self.SpiceBot_Database["nicks"][nick_id].keys():
self.SpiceBot_Database["nicks"][nick_id][sorting_key] = bot.db.get_nick_value(nick, sorting_key) or dict()
del self.SpiceBot_Database["nicks"][nick_id][sorting_key][key]
bot.db.set_nick_value(nick, sorting_key, self.SpiceBot_Database["nicks"][nick_id][sorting_key])
self.lock.release()
def adjust_nick_value(self, bot, nick, key, value, sorting_key='unsorted'):
self.lock.acquire()
nick = Identifier(nick)
nick_id = bot.db.get_nick_id(nick, create=True)
if nick_id not in self.SpiceBot_Database["nicks"].keys():
self.SpiceBot_Database["nicks"][nick_id] = {}
if sorting_key not in self.SpiceBot_Database["nicks"][nick_id].keys():
self.SpiceBot_Database["nicks"][nick_id][sorting_key] = bot.db.get_nick_value(nick, sorting_key) or dict()
if key not in self.SpiceBot_Database["nicks"][nick_id][sorting_key].keys():
oldvalue = []
else:
oldvalue = self.SpiceBot_Database["nicks"][nick_id][sorting_key][key]
if not oldvalue:
self.SpiceBot_Database["nicks"][nick_id][sorting_key][key] = value
else:
self.SpiceBot_Database["nicks"][nick_id][sorting_key][key] = oldvalue + value
bot.db.set_nick_value(nick, sorting_key, self.SpiceBot_Database["nicks"][nick_id][sorting_key])
self.lock.release()
def adjust_nick_list(self, bot, nick, key, entries, adjustmentdirection, sorting_key='unsorted'):
self.lock.acquire()
if not isinstance(entries, list):
entries = [entries]
nick = Identifier(nick)
nick_id = bot.db.get_nick_id(nick, create=True)
if nick_id not in self.SpiceBot_Database["nicks"].keys():
self.SpiceBot_Database["nicks"][nick_id] = {}
if sorting_key not in self.SpiceBot_Database["nicks"][nick_id].keys():
self.SpiceBot_Database["nicks"][nick_id][sorting_key] = bot.db.get_nick_value(nick, sorting_key) or dict()
if key not in self.SpiceBot_Database["nicks"][nick_id][sorting_key].keys():
self.SpiceBot_Database["nicks"][nick_id][sorting_key][key] = []
if adjustmentdirection == 'add':
for entry in entries:
if entry not in self.SpiceBot_Database["nicks"][nick_id][sorting_key][key]:
self.SpiceBot_Database["nicks"][nick_id][sorting_key][key].append(entry)
elif adjustmentdirection == 'del':
for entry in entries:
while entry in self.SpiceBot_Database["nicks"][nick_id][sorting_key][key]:
self.SpiceBot_Database["nicks"][nick_id][sorting_key][key].remove(entry)
bot.db.set_nick_value(nick, sorting_key, self.SpiceBot_Database["nicks"][nick_id][sorting_key])
self.lock.release()
"""Channels"""
def get_channel_value(self, bot, channel, key, sorting_key='unsorted'):
self.lock.acquire()
channel = Identifier(channel)
if channel not in self.SpiceBot_Database["channels"].keys():
self.SpiceBot_Database["channels"][channel] = {}
if sorting_key not in self.SpiceBot_Database["channels"][channel].keys():
self.SpiceBot_Database["channels"][channel][sorting_key] = bot.db.get_channel_value(channel, sorting_key) or dict()
self.lock.release()
if key not in self.SpiceBot_Database["channels"][channel][sorting_key].keys():
return None
else:
return self.SpiceBot_Database["channels"][channel][sorting_key][key]
def set_channel_value(self, bot, channel, key, value, sorting_key='unsorted'):
self.lock.acquire()
channel = Identifier(channel)
if channel not in self.SpiceBot_Database["channels"].keys():
self.SpiceBot_Database["channels"][channel] = {}
if sorting_key not in self.SpiceBot_Database["channels"][channel].keys():
self.SpiceBot_Database["channels"][channel][sorting_key] = bot.db.get_channel_value(channel, sorting_key) or dict()
self.SpiceBot_Database["channels"][channel][sorting_key][key] = value
bot.db.set_channel_value(channel, sorting_key, self.SpiceBot_Database["channels"][channel][sorting_key])
self.lock.release()
def delete_channel_value(self, bot, channel, key, sorting_key='unsorted'):
self.lock.acquire()
channel = Identifier(channel)
if channel not in self.SpiceBot_Database["channels"].keys():
self.SpiceBot_Database["channels"][channel] = {}
if sorting_key not in self.SpiceBot_Database["channels"][channel].keys():
self.SpiceBot_Database["channels"][channel][sorting_key] = bot.db.get_channel_value(channel, sorting_key) or dict()
del self.SpiceBot_Database["channels"][channel][sorting_key][key]
bot.db.set_channel_value(channel, sorting_key, self.SpiceBot_Database["channels"][channel][sorting_key])
self.lock.release()
def adjust_channel_value(self, bot, channel, key, value, sorting_key='unsorted'):
self.lock.acquire()
channel = Identifier(channel)
if channel not in self.SpiceBot_Database["channels"].keys():
self.SpiceBot_Database["channels"][channel] = {}
if sorting_key not in self.SpiceBot_Database["channels"][channel].keys():
self.SpiceBot_Database["channels"][channel][sorting_key] = bot.db.get_channel_value(channel, sorting_key) or dict()
if key not in self.SpiceBot_Database["channels"][channel][sorting_key].keys():
oldvalue = None
else:
oldvalue = self.SpiceBot_Database["channels"][channel][sorting_key][key]
if not oldvalue:
self.SpiceBot_Database["channels"][channel][sorting_key][key] = value
else:
self.SpiceBot_Database["channels"][channel][sorting_key][key] = oldvalue + value
bot.db.set_channel_value(channel, sorting_key, self.SpiceBot_Database["channels"][channel][sorting_key])
self.lock.release()
def adjust_channel_list(self, bot, channel, key, entries, adjustmentdirection, sorting_key='unsorted'):
self.lock.acquire()
if not isinstance(entries, list):
entries = [entries]
channel = Identifier(channel)
if channel not in self.SpiceBot_Database["channels"].keys():
self.SpiceBot_Database["channels"][channel] = {}
if sorting_key not in self.SpiceBot_Database["channels"][channel].keys():
self.SpiceBot_Database["channels"][channel][sorting_key] = bot.db.get_channel_value(channel, sorting_key) or dict()
if key not in self.SpiceBot_Database["channels"][channel][sorting_key].keys():
self.SpiceBot_Database["channels"][channel][sorting_key][key] = []
if adjustmentdirection == 'add':
for entry in entries:
if entry not in self.SpiceBot_Database["channels"][channel][sorting_key][key]:
self.SpiceBot_Database["channels"][channel][sorting_key][key].append(entry)
elif adjustmentdirection == 'del':
for entry in entries:
while entry in self.SpiceBot_Database["channels"][channel][sorting_key][key]:
self.SpiceBot_Database["channels"][channel][sorting_key][key].remove(entry)
bot.db.set_channel_value(channel, sorting_key, self.SpiceBot_Database["channels"][channel][sorting_key])
self.lock.release()
botdb = BotDatabase()

View File

@ -11,6 +11,7 @@ from .Logs import *
from .Commands import *
from .Events import *
from .Channels import *
from .Database import *
__author__ = 'Sam Zick'
__email__ = 'sam@deathbybandaid.net'

View File

@ -1,19 +0,0 @@
#!/usr/bin/env python
# coding=utf-8
from __future__ import unicode_literals, absolute_import, print_function, division
# sopel imports
import sopel.module
from sopel_modules.SpiceBot.Logs import botlogs
def setup(bot):
botlogs.log('SpiceBot_DatabaseCache', "Setting up Database Cache")
if 'SpiceBot_DatabaseCache' not in bot.memory:
bot.memory['SpiceBot_DatabaseCache'] = dict()
def shutdown(bot):
if "SpiceBot_DatabaseCache" in bot.memory:
del bot.memory["SpiceBot_DatabaseCache"]

View File

@ -1,6 +0,0 @@
# coding=utf-8
"""Useful miscellaneous tools and shortcuts for SpiceBot Sopel modules
"""
from __future__ import unicode_literals, absolute_import, print_function, division
from .DatabaseCache import *

View File

@ -1,57 +0,0 @@
#!/usr/bin/env python
# coding=utf-8
from __future__ import unicode_literals, absolute_import, print_function, division
# sopel imports
import sopel.module
"""Database Direct"""
# Get a value
def db_get_nick_value(bot, nick, key):
database_value = bot.db.get_nick_value(nick, key) or None
return database_value
# set a value
def db_set_nick_value(bot, nick, key, value):
bot.db.set_nick_value(nick, key, value)
# DELETE a value
def db_reset_value(bot, nick, key):
bot.db.reset_nick_value(nick, key)
# add or subtract from current value
def db_adjust_value(bot, nick, key, value):
bot.db.adjust_nick_value(nick, key, value)
# list stored in database, add or remove elements
def db_adjust_list(bot, nick, entries, key, adjustmentdirection):
if not isinstance(entries, list):
entries = [entries]
adjustlist = db_get_nick_value(bot, nick, key) or []
adjustlistnew = []
for x in adjustlist:
adjustlistnew.append(x)
db_reset_value(bot, nick, key)
adjustlist = []
if adjustmentdirection == 'add':
for y in entries:
if y not in adjustlistnew:
adjustlistnew.append(y)
elif adjustmentdirection == 'del':
for y in entries:
if y in adjustlistnew:
adjustlistnew.remove(y)
for x in adjustlistnew:
if x not in adjustlist:
adjustlist.append(x)
if not len(adjustlist):
db_reset_value(bot, nick, key)
else:
db_set_nick_value(bot, nick, key, adjustlist)

View File

@ -1,6 +0,0 @@
# coding=utf-8
"""Useful miscellaneous tools and shortcuts for SpiceBot Sopel modules
"""
from __future__ import unicode_literals, absolute_import, print_function, division
from .DatabaseTools import *