From 47ca4ca2fcd7803b06a3e0b0edf3768c26bd5b3b Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Fri, 23 May 2014 20:33:40 +0200 Subject: [PATCH] Storage: Implement GetSpecificRecords, fix errors in UpdateRecord. --- storage_server.py | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/storage_server.py b/storage_server.py index e237466..486a7fd 100644 --- a/storage_server.py +++ b/storage_server.py @@ -125,7 +125,7 @@ class StorageHTTPServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): ret += '<' + shortaction + 'Result>Success' # TODO: Actually make GetMyRecords only return *my* records - if action == '"http://gamespy.net/sake/SearchForRecords"' or action == '"http://gamespy.net/sake/GetMyRecords"': + if shortaction == 'SearchForRecords' or shortaction == 'GetMyRecords' or shortaction == 'GetSpecificRecords': columndata = data.getElementsByTagName('ns1:fields')[0].getElementsByTagName('ns1:string') try: columns = self.confirm_columns(columndata, table) @@ -139,6 +139,17 @@ class StorageHTTPServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): for c in columns[1:]: statement += ',' + c statement += ' FROM ' + table + + if shortaction == 'GetSpecificRecords': + recordids = data.getElementsByTagName('ns1:recordids')[0].getElementsByTagName('ns1:int') + + # limit to requested records + id = int(recordids[0].firstChild.data) + statement += ' WHERE recordid = ' + str(id) + for r in recordids[1:]: + id = int(r.firstChild.data) + statement += ' OR recordid = ' + str(id) + cursor = self.server.db.cursor() cursor.execute(statement) @@ -168,7 +179,7 @@ class StorageHTTPServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): ret += '' - elif action == '"http://gamespy.net/sake/GetRecordCount"': + elif shortaction == 'GetRecordCount': statement = 'SELECT COUNT(1) FROM ' + table cursor = self.server.db.cursor() @@ -177,8 +188,8 @@ class StorageHTTPServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): ret += '' + str(count) + '' - elif action == '"http://gamespy.net/sake/UpdateRecord"': - recordid = str(int(data.getElementsByTagName('ns1:recordid')[0].firstChild.data)) + elif shortaction == 'UpdateRecord': + recordid = int(data.getElementsByTagName('ns1:recordid')[0].firstChild.data) columndata = [] values = data.getElementsByTagName('ns1:values')[0] @@ -193,21 +204,26 @@ class StorageHTTPServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): return rowdata = [] - for rf in recordfields: - cn = rf.getElementsByTagName('ns1:value')[0].childNodes - # circumvent checking for and so on by just taking whatever is there - rowdata.append( cn[len(cn)/2].getElementsByTagName('ns1:value')[0].firstChild.data ) + for i, rf in enumerate(recordfields): + type = self.server.get_typedata(table, columns[i]) + value = rf.getElementsByTagName('ns1:value')[0].getElementsByTagName('ns1:' + type)[0].getElementsByTagName('ns1:value')[0].firstChild.data + if type == 'intValue' or type == 'booleanValue': + rowdata.append( int(value) ) + elif type == 'floatValue': + rowdata.append( float(value) ) + else: + rowdata.append( value ) statement = 'UPDATE ' + table + ' SET ' statement += columns[0] + ' = ?' for c in columns[1:]: - statement += ' AND ' + c + ' = ?' + statement += ', ' + c + ' = ?' statement += ' WHERE recordid = ?' rowdata.append( recordid ) cursor = self.server.db.cursor() - cursor.execute(statement, rowdata) + cursor.execute(statement, tuple(rowdata)) self.server.db.commit() ret += ''