update db.py documentation and code to reflect newest changes
parent
c65e459340
commit
cf16169027
58
src/db.py
58
src/db.py
|
@ -2,7 +2,10 @@
|
||||||
This module contains all of the interaction with the SQLite database. It
|
This module contains all of the interaction with the SQLite database. It
|
||||||
doesnt hold a connection itself, rather, a connection is passed in as
|
doesnt hold a connection itself, rather, a connection is passed in as
|
||||||
an argument to all the functions and is maintained by CherryPy's threading
|
an argument to all the functions and is maintained by CherryPy's threading
|
||||||
system. This is clunky but fuck it, it works.
|
system. This is clunky but fuck it, it works (for now at least).
|
||||||
|
|
||||||
|
(foreword: formatting is not currently implemented but its an important
|
||||||
|
feature needed in the final version)
|
||||||
|
|
||||||
All post and thread data are stored in the database without formatting.
|
All post and thread data are stored in the database without formatting.
|
||||||
This is questionable, as it causes formatting to be reapplied with each
|
This is questionable, as it causes formatting to be reapplied with each
|
||||||
|
@ -31,8 +34,8 @@ anon = None
|
||||||
|
|
||||||
def thread_get(connection, thread_id, messages=True):
|
def thread_get(connection, thread_id, messages=True):
|
||||||
"""
|
"""
|
||||||
Fetch the thread_id from the database, and assign and format
|
Fetch the thread_id from the database. Formatting is be handled
|
||||||
all of its messages as requested.
|
elsewhere.
|
||||||
|
|
||||||
MESSAGES, if False, will omit the inclusion of a thread's messages
|
MESSAGES, if False, will omit the inclusion of a thread's messages
|
||||||
and only get its metadata, such as title, author, etc.
|
and only get its metadata, such as title, author, etc.
|
||||||
|
@ -48,14 +51,20 @@ def thread_get(connection, thread_id, messages=True):
|
||||||
if messages:
|
if messages:
|
||||||
c.execute("""SELECT * FROM messages WHERE thread_id = ?
|
c.execute("""SELECT * FROM messages WHERE thread_id = ?
|
||||||
ORDER BY post_id""", (thread_id,))
|
ORDER BY post_id""", (thread_id,))
|
||||||
# create a dictionary where each message is accessible by its
|
# create a list where each post_id matches its list[index]
|
||||||
# integer post_id as a key
|
|
||||||
thread["messages"] = [schema.message(*values) for values in c.fetchall()]
|
thread["messages"] = [schema.message(*values) for values in c.fetchall()]
|
||||||
|
|
||||||
return thread
|
return thread
|
||||||
|
|
||||||
|
|
||||||
def thread_index(connection):
|
def thread_index(connection):
|
||||||
|
"""
|
||||||
|
Return a list with each thread, ordered by the date they
|
||||||
|
were last modifed (which could be when it was submitted
|
||||||
|
or its last reply)
|
||||||
|
|
||||||
|
Please note that thred["messages"] is omitted.
|
||||||
|
"""
|
||||||
c = connection.cursor()
|
c = connection.cursor()
|
||||||
c.execute("""
|
c.execute("""
|
||||||
SELECT thread_id FROM threads
|
SELECT thread_id FROM threads
|
||||||
|
@ -68,6 +77,9 @@ def thread_index(connection):
|
||||||
|
|
||||||
|
|
||||||
def thread_create(connection, author_id, body, title):
|
def thread_create(connection, author_id, body, title):
|
||||||
|
"""
|
||||||
|
Create a new thread and return it.
|
||||||
|
"""
|
||||||
validate([
|
validate([
|
||||||
("body", body),
|
("body", body),
|
||||||
("title", title)
|
("title", title)
|
||||||
|
@ -85,20 +97,24 @@ def thread_create(connection, author_id, body, title):
|
||||||
""", schema_values("thread", scheme))
|
""", schema_values("thread", scheme))
|
||||||
connection.commit()
|
connection.commit()
|
||||||
|
|
||||||
scheme["messages"] = {
|
scheme["messages"] = [
|
||||||
0: thread_reply(connection, author_id, thread_id, body, time_override=now)
|
thread_reply(connection, author_id, thread_id, body, time_override=now)
|
||||||
}
|
]
|
||||||
scheme["reply_count"] = 0
|
scheme["reply_count"] = 0
|
||||||
# note that thread_reply returns a schema object
|
# note that thread_reply returns a schema object
|
||||||
# after committing the new message to the database.
|
# after committing the new message to the database.
|
||||||
# here i mimic a real thread_get by including a mock
|
# here i mimic a real thread_get by including a mock
|
||||||
# message dictionary, and then setting the reply_count
|
# message array, and then setting the reply_count
|
||||||
# to reflect its new database value, so the response
|
# to reflect its new database value, so the response
|
||||||
# can be loaded as a normal thread object
|
# can be loaded as a normal thread object
|
||||||
|
# this hackery needs a bit more testing
|
||||||
return scheme
|
return scheme
|
||||||
|
|
||||||
|
|
||||||
def thread_reply(connection, author_id, thread_id, body, time_override=None):
|
def thread_reply(connection, author_id, thread_id, body, time_override=None):
|
||||||
|
"""
|
||||||
|
Submit a new reply for thread_id. Return the new reply object.
|
||||||
|
"""
|
||||||
validate([("body", body)])
|
validate([("body", body)])
|
||||||
|
|
||||||
now = time_override or time()
|
now = time_override or time()
|
||||||
|
@ -127,11 +143,15 @@ def thread_reply(connection, author_id, thread_id, body, time_override=None):
|
||||||
|
|
||||||
|
|
||||||
def message_edit_query(connection, author, thread_id, post_id):
|
def message_edit_query(connection, author, thread_id, post_id):
|
||||||
|
"""
|
||||||
|
Perform all the neccesary sanity checks required to edit a post
|
||||||
|
and then return the requested message object without any changes.
|
||||||
|
"""
|
||||||
user = user_resolve(connection, author)
|
user = user_resolve(connection, author)
|
||||||
thread = thread_get(connection, thread_id)
|
thread = thread_get(connection, thread_id)
|
||||||
|
|
||||||
try: message = thread["messages"][post_id]
|
try: message = thread["messages"][post_id]
|
||||||
except KeyError:
|
except IndexError:
|
||||||
raise BBJParameterError("post_id out of bounds for requested thread")
|
raise BBJParameterError("post_id out of bounds for requested thread")
|
||||||
|
|
||||||
if not user["admin"]:
|
if not user["admin"]:
|
||||||
|
@ -147,6 +167,10 @@ def message_edit_query(connection, author, thread_id, post_id):
|
||||||
|
|
||||||
|
|
||||||
def message_edit_commit(connection, author_id, thread_id, post_id, new_body):
|
def message_edit_commit(connection, author_id, thread_id, post_id, new_body):
|
||||||
|
"""
|
||||||
|
Attempt to commit new_body to the existing message. Touches base with
|
||||||
|
message_edit_query first. Returns the newly updated message object.
|
||||||
|
"""
|
||||||
validate([("body", new_body)])
|
validate([("body", new_body)])
|
||||||
message = message_edit_query(author_id, thread_id, post_id)
|
message = message_edit_query(author_id, thread_id, post_id)
|
||||||
message["body"] = new_body
|
message["body"] = new_body
|
||||||
|
@ -194,6 +218,14 @@ def user_register(connection, user_name, auth_hash):
|
||||||
|
|
||||||
|
|
||||||
def user_resolve(connection, name_or_id, externalize=False, return_false=True):
|
def user_resolve(connection, name_or_id, externalize=False, return_false=True):
|
||||||
|
"""
|
||||||
|
Accepts a name or id and returns the full user object for it.
|
||||||
|
|
||||||
|
EXTERNALIZE determines whether to strip the object of private data.
|
||||||
|
|
||||||
|
RETURN_FALSE determines whether to raise an exception or just
|
||||||
|
return bool False if the user doesn't exist
|
||||||
|
"""
|
||||||
c = connection.cursor()
|
c = connection.cursor()
|
||||||
c.execute("""
|
c.execute("""
|
||||||
SELECT * FROM users
|
SELECT * FROM users
|
||||||
|
@ -216,6 +248,12 @@ def user_resolve(connection, name_or_id, externalize=False, return_false=True):
|
||||||
|
|
||||||
|
|
||||||
def user_update(connection, user_object, parameters):
|
def user_update(connection, user_object, parameters):
|
||||||
|
"""
|
||||||
|
Accepts new parameters for a user object and then
|
||||||
|
commits the changes to the database. Parameters
|
||||||
|
that are not suitable for editing (like user_id
|
||||||
|
and anything undefined) are ignored completely.
|
||||||
|
"""
|
||||||
user_id = user_object["user_id"]
|
user_id = user_object["user_id"]
|
||||||
for key in ("user_name", "auth_hash", "quip", "bio", "color"):
|
for key in ("user_name", "auth_hash", "quip", "bio", "color"):
|
||||||
value = parameters.get(key)
|
value = parameters.get(key)
|
||||||
|
|
Loading…
Reference in New Issue