|
@@ -75,7 +75,7 @@ def used_key_count():
|
|
|
connect()
|
|
|
|
|
|
cursor.execute('''
|
|
|
- SELECT COUNT(*)
|
|
|
+ SELECT COUNT(*) -- rarely executed, no index needed, O(n) query
|
|
|
FROM keys
|
|
|
WHERE used_by_user_id IS NOT NULL
|
|
|
''')
|
|
@@ -130,16 +130,8 @@ def own(user_id, ownable_name):
|
|
|
return AssertionError('A name must be a string.')
|
|
|
|
|
|
cursor.execute('''
|
|
|
- WITH one_ownable_id AS (SELECT rowid FROM ownables WHERE name = ?),
|
|
|
- one_user_id AS (SELECT ?)
|
|
|
- INSERT INTO ownership (user_id, ownable_id)
|
|
|
- SELECT *
|
|
|
- FROM one_user_id, one_ownable_id
|
|
|
- WHERE NOT EXISTS (
|
|
|
- SELECT * FROM ownership
|
|
|
- WHERE ownership.user_id IN one_user_id
|
|
|
- AND ownership.ownable_id IN one_ownable_id
|
|
|
- )
|
|
|
+ INSERT OR IGNORE INTO ownership (user_id, ownable_id)
|
|
|
+ SELECT ?, (SELECT rowid FROM ownables WHERE name = ?)
|
|
|
''', (ownable_name, user_id,))
|
|
|
|
|
|
|
|
@@ -287,7 +279,7 @@ def get_user_ownership(user_id):
|
|
|
ELSE (SELECT price
|
|
|
FROM transactions
|
|
|
WHERE ownable_id = ownership.ownable_id
|
|
|
- ORDER BY dt DESC
|
|
|
+ ORDER BY rowid DESC -- equivalent to ordering by dt
|
|
|
LIMIT 1)
|
|
|
END, 0) AS price,
|
|
|
(SELECT MAX("limit")
|
|
@@ -464,7 +456,7 @@ def news():
|
|
|
SELECT * FROM
|
|
|
(SELECT *
|
|
|
FROM news
|
|
|
- ORDER BY dt DESC
|
|
|
+ ORDER BY rowid DESC -- equivalent to order by dt
|
|
|
LIMIT 20) n
|
|
|
ORDER BY dt ASC
|
|
|
''')
|
|
@@ -595,7 +587,7 @@ def current_value(ownable_id):
|
|
|
cursor.execute('''SELECT price
|
|
|
FROM transactions
|
|
|
WHERE ownable_id = ?
|
|
|
- ORDER BY dt DESC
|
|
|
+ ORDER BY rowid DESC -- equivalent to order by dt
|
|
|
LIMIT 1
|
|
|
''', (ownable_id,))
|
|
|
return cursor.fetchone()[0]
|
|
@@ -719,6 +711,7 @@ def execute_orders(ownable_id):
|
|
|
|
|
|
# trigger stop-loss orders
|
|
|
if buyer_id != seller_id:
|
|
|
+ # todo optimize this query, very slow like this
|
|
|
cursor.execute('''
|
|
|
UPDATE orders
|
|
|
SET stop_loss = NULL,
|
|
@@ -770,7 +763,7 @@ def bank_order(buy, ownable_id, limit, amount, time_until_expiration):
|
|
|
''', ('External investors are selling ' + ownable_name + ' atm',))
|
|
|
|
|
|
|
|
|
-def current_time(): # might differ from datetime.datetime.now() for time zone reasons
|
|
|
+def current_db_time(): # might differ from datetime.datetime.now() for time zone reasons
|
|
|
connect()
|
|
|
|
|
|
cursor.execute('''
|
|
@@ -782,7 +775,7 @@ def current_time(): # might differ from datetime.datetime.now() for time zone r
|
|
|
|
|
|
def place_order(buy, ownership_id, limit, stop_loss, amount, time_until_expiration):
|
|
|
connect()
|
|
|
- expiry = datetime.strptime(current_time(), '%Y-%m-%d %H:%M:%S') + timedelta(minutes=time_until_expiration)
|
|
|
+ expiry = datetime.strptime(current_db_time(), '%Y-%m-%d %H:%M:%S') + timedelta(minutes=time_until_expiration)
|
|
|
|
|
|
cursor.execute('''
|
|
|
INSERT INTO orders
|
|
@@ -801,7 +794,7 @@ def transactions(ownable_id):
|
|
|
SELECT dt, amount, price
|
|
|
FROM transactions
|
|
|
WHERE ownable_id = ?
|
|
|
- ORDER BY dt DESC
|
|
|
+ ORDER BY rowid DESC -- equivalent to order by dt
|
|
|
''', (ownable_id,))
|
|
|
|
|
|
return cursor.fetchall()
|
|
@@ -858,7 +851,7 @@ def leaderboard():
|
|
|
ELSE ownership.amount * (SELECT price
|
|
|
FROM transactions
|
|
|
WHERE ownable_id = ownership.ownable_id
|
|
|
- ORDER BY dt DESC
|
|
|
+ ORDER BY rowid DESC -- equivalent to ordering by dt
|
|
|
LIMIT 1)
|
|
|
END
|
|
|
) score
|
|
@@ -884,7 +877,7 @@ def user_wealth(user_id):
|
|
|
ELSE ownership.amount * (SELECT price
|
|
|
FROM transactions
|
|
|
WHERE ownable_id = ownership.ownable_id
|
|
|
- ORDER BY dt DESC
|
|
|
+ ORDER BY rowid DESC -- equivalent to ordering by dt
|
|
|
LIMIT 1)
|
|
|
END
|
|
|
) score
|
|
@@ -901,7 +894,7 @@ def change_password(session_id, password):
|
|
|
cursor.execute('''
|
|
|
UPDATE users
|
|
|
SET password = ?
|
|
|
- WHERE ? IN (SELECT session_id FROM sessions WHERE sessions.user_id = users.rowid)
|
|
|
+ WHERE rowid = (SELECT user_id FROM sessions WHERE sessions.session_id = ?)
|
|
|
''', (password, session_id,))
|
|
|
|
|
|
|