readd database functions

This commit is contained in:
deathbybandaid 2019-05-13 15:33:44 -04:00
parent b894ee93c5
commit ff03cc903a
2 changed files with 82 additions and 48 deletions

View File

@ -6,7 +6,8 @@ from __future__ import unicode_literals, absolute_import, print_function, divisi
import sopel.module import sopel.module
from sopel.tools import Identifier from sopel.tools import Identifier
from sopel_modules.SpiceBot_SBTools import bot_logging from sopel_modules.SpiceBot_SBTools import bot_logging
from sopel.db import _deserialize, SopelDB from sopel.db import SopelDB, NickValues, ChannelValues
from sqlalchemy.exc import SQLAlchemyError
import json import json
@ -15,64 +16,104 @@ def setup(bot):
pass pass
# Inject Database Functions # Inject Database Functions
bot_logging(bot, 'SpiceBot_Databaseaddons', "Implanting Database functions into bot") bot_logging(bot, 'SpiceBot_Databaseaddons', "Implanting Database functions into bot")
SopelDB.reset_nick_value = SopelDBCache.reset_nick_value SopelDB.delete_nick_value = SopelDBCache.delete_nick_value
SopelDB.adjust_nick_value = SopelDBCache.adjust_nick_value # SopelDB.adjust_nick_value = SopelDBCache.adjust_nick_value
SopelDB.reset_channel_value = SopelDBCache.reset_channel_value SopelDB.delete_channel_value = SopelDBCache.delete_channel_value
SopelDB.adjust_channel_value = SopelDBCache.adjust_channel_value # SopelDB.adjust_channel_value = SopelDBCache.adjust_channel_value
SopelDB._create_table = SopelDBCache._create_table
class SopelDBCache: class SopelDBCache:
"""Dynamic Table Creation"""
def _create_table(self, tablename):
self.execute('CREATE TABLE IF NOT EXISTS ? (mainid STRING, key STRING, value STRING, PRIMARY KEY (mainid, key))', tablename)
"""Nicks""" """Nicks"""
def reset_nick_value(self, nick, key): def delete_nick_value(self, nick, key):
"""Resets the value for a given key to be associated with the nick.""" """Deletes the value for a given key to be associated with the nick."""
nick = Identifier(nick) nick = Identifier(nick)
nick_id = self.get_nick_id(nick) nick_id = self.get_nick_id(nick)
self.execute('DELETE FROM nick_values WHERE nick_id = ? AND key = ?', [nick_id, key]) session = self.ssession()
try:
result = session.query(NickValues) \
.filter(NickValues.nick_id == nick_id) \
.filter(NickValues.key == key) \
.one_or_none()
# NickValue exists, delete
if result:
session.delete(result.value)
session.commit()
except SQLAlchemyError:
session.rollback()
raise
finally:
session.close()
def adjust_nick_value(self, nick, key, value): def adjust_nick_value(self, nick, key, value):
"""Adjusts the value for a given key to be associated with the nick.""" """Sets the value for a given key to be associated with the nick."""
nick = Identifier(nick) nick = Identifier(nick)
result = self.execute(
'SELECT value FROM nicknames JOIN nick_values '
'ON nicknames.nick_id = nick_values.nick_id '
'WHERE slug = ? AND key = ?',
[nick.lower(), key]
).fetchone()
if result is not None:
result = result[0]
current_value = _deserialize(result)
value = current_value + value
value = json.dumps(value, ensure_ascii=False) value = json.dumps(value, ensure_ascii=False)
nick_id = self.get_nick_id(nick) nick_id = self.get_nick_id(nick)
self.execute('INSERT OR REPLACE INTO nick_values VALUES (?, ?, ?)', session = self.ssession()
[nick_id, key, value]) try:
result = session.query(NickValues) \
.filter(NickValues.nick_id == nick_id) \
.filter(NickValues.key == key) \
.one_or_none()
# NickValue exists, update
if result:
result.value = result.value + value
session.commit()
# DNE - Insert
else:
new_nickvalue = NickValues(nick_id=nick_id, key=key, value=value)
session.add(new_nickvalue)
session.commit()
except SQLAlchemyError:
session.rollback()
raise
finally:
session.close()
"""Channels""" """Channels"""
def reset_channel_value(self, channel, key): def delete_channel_value(self, channel, key):
"""Resets the value for a given key to be associated with a channel.""" """Sets the value for a given key to be associated with the channel."""
channel = Identifier(channel).lower() channel = Identifier(channel).lower()
self.execute('DELETE FROM channel_values WHERE channel = ? AND key = ?', [channel, key]) session = self.ssession()
try:
result = session.query(ChannelValues) \
.filter(ChannelValues.channel == channel)\
.filter(ChannelValues.key == key) \
.one_or_none()
# ChannelValue exists, update
if result:
session.delete(result.value)
session.commit()
except SQLAlchemyError:
session.rollback()
raise
finally:
session.close()
def adjust_channel_value(self, channel, key, value): def adjust_channel_value(self, channel, key, value):
"""Adjusts the value for a given key to be associated with the channel.""" """Sets the value for a given key to be associated with the channel."""
channel = Identifier(channel).lower() channel = Identifier(channel).lower()
result = self.execute(
'SELECT value FROM channel_values WHERE channel = ? AND key = ?',
[channel, key]
).fetchone()
if result is not None:
result = result[0]
current_value = _deserialize(result)
value = current_value + value
value = json.dumps(value, ensure_ascii=False) value = json.dumps(value, ensure_ascii=False)
self.execute('INSERT OR REPLACE INTO channel_values VALUES (?, ?, ?)', session = self.ssession()
[channel, key, value]) try:
result = session.query(ChannelValues) \
.filter(ChannelValues.channel == channel)\
.filter(ChannelValues.key == key) \
.one_or_none()
# ChannelValue exists, update
if result:
result.value = result.value + value
session.commit()
# DNE - Insert
else:
new_channelvalue = ChannelValues(channel=channel, key=key, value=value)
session.add(new_channelvalue)
session.commit()
except SQLAlchemyError:
session.rollback()
raise
finally:
session.close()

View File

@ -6,13 +6,6 @@ from __future__ import unicode_literals, absolute_import, print_function, divisi
import sopel.module import sopel.module
"""Dyanmic Table Creation"""
def db_create_table(bot, tablename):
bot.db._create_table(tablename)
"""Database Direct""" """Database Direct"""