model.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. import re
  2. import sqlite3 as db
  3. import sys
  4. import uuid
  5. from game import money_amount
  6. from util import debug
  7. connection = None
  8. cursor = None
  9. db_name = None
  10. def query_save_name():
  11. global db_name
  12. if debug:
  13. db_name = 'test.db'
  14. return
  15. while True:
  16. save_name = input('Name of the savegame: ')
  17. if re.match(r"[A-Za-z0-9.-]{0,50}", save_name):
  18. db_name = save_name + '.db'
  19. return
  20. def connect(reconnect=False):
  21. global connection
  22. global cursor
  23. global db_name
  24. if reconnect:
  25. connection.commit()
  26. connection.close()
  27. cursor = None
  28. connection = None
  29. db_name = None
  30. if connection is None or cursor is None:
  31. query_save_name()
  32. try:
  33. connection = db.connect(db_name)
  34. cursor = connection.cursor()
  35. except db.Error as e:
  36. print("Database error %s:" % e.args[0])
  37. sys.exit(1)
  38. # finally:
  39. # if con is not None:
  40. # con.close()
  41. def setup():
  42. connect()
  43. print('Database setup...')
  44. replace = False
  45. if replace:
  46. print(' - Dropping old tables...')
  47. cursor.execute("DROP TABLE IF EXISTS users")
  48. cursor.execute("DROP TABLE IF EXISTS ownables")
  49. cursor.execute("DROP TABLE IF EXISTS ownership")
  50. cursor.execute("DROP TABLE IF EXISTS sessions")
  51. cursor.execute("DROP TABLE IF EXISTS orders")
  52. cursor.execute("DROP TABLE IF EXISTS transactions")
  53. print(' - Creating tables...')
  54. cursor.execute('''
  55. CREATE TABLE IF NOT EXISTS users(
  56. username VARCHAR(10) UNIQUE NOT NULL,
  57. password VARCHAR(6) NOT NULL)
  58. ''')
  59. cursor.execute('''
  60. CREATE TABLE IF NOT EXISTS ownables(
  61. name VARCHAR(10) UNIQUE NOT NULL,
  62. total_amount CURRENCY NOT NULL)
  63. ''')
  64. cursor.execute('''
  65. CREATE TABLE IF NOT EXISTS ownership(
  66. user_id INTEGER NOT NULL,
  67. ownable_id INTEGER NOT NULL,
  68. amount CURRENCY NOT NULL DEFAULT 0,
  69. FOREIGN KEY (user_id) REFERENCES users(rowid),
  70. FOREIGN KEY (ownable_id) REFERENCES ownables(rowid),
  71. UNIQUE (user_id, stock_id)
  72. )
  73. ''')
  74. cursor.execute('''
  75. CREATE TABLE IF NOT EXISTS sessions(
  76. user_id INTEGER NOT NULL,
  77. session_id STRING NOT NULL,
  78. FOREIGN KEY (user_id) REFERENCES users(rowid)
  79. )
  80. ''')
  81. cursor.execute('''
  82. CREATE TABLE IF NOT EXISTS orders(
  83. ownership_id INTEGER NOT NULL,
  84. buy BOOLEAN NOT NULL,
  85. limit CURRENCY,
  86. stop_loss BOOLEAN,
  87. ordered_amount CURRENCY,
  88. executed_amount CURRENCY,
  89. FOREIGN KEY (ownership_id) REFERENCES ownership(rowid)
  90. )
  91. ''')
  92. cursor.execute('''
  93. CREATE TABLE IF NOT EXISTS transactions(
  94. dt DATETIME NOT NULL,
  95. price CURRENCY NOT NULL,
  96. ownable_id INTEGER NOT NULL,
  97. FOREIGN KEY (ownable_id) REFERENCES ownable(rowid)
  98. )
  99. ''')
  100. if replace: # TODO also seed new databases
  101. print(' - Seeding initial data...')
  102. cursor.execute('''
  103. INSERT INTO users
  104. (username, password)
  105. VALUES ("bank", "")
  106. ''')
  107. cursor.execute('''
  108. SELECT rowid
  109. FROM users
  110. WHERE username = "bank"
  111. ''')
  112. bank_id = cursor.fetchone()[0]
  113. cursor.execute('''
  114. INSERT INTO ownables
  115. (name, total_amount)
  116. VALUES ("Kollar", ?)
  117. ''', (money_amount,))
  118. cursor.execute('''
  119. SELECT rowid
  120. FROM users
  121. WHERE username = "bank"
  122. ''')
  123. kollar_id = cursor.fetchone()[0]
  124. cursor.execute('''
  125. INSERT INTO ownership
  126. (user_id, ownable_id, amount)
  127. VALUES (?, ?, ?)
  128. ''', (bank_id, kollar_id, money_amount))
  129. def login(username, password):
  130. connect()
  131. # do not allow login as bank
  132. if password == '':
  133. return None
  134. cursor.execute('''
  135. SELECT rowid
  136. FROM users
  137. WHERE username = ?
  138. AND password = ?
  139. ''', (username, password))
  140. user_id = cursor.fetchone()
  141. if user_id:
  142. return new_session(user_id)
  143. else:
  144. return None
  145. def register(username, password):
  146. connect()
  147. if username == '':
  148. return False
  149. if password == '':
  150. return False
  151. cursor.execute('''
  152. INSERT INTO users
  153. (username, password)
  154. VALUES (? , ?)
  155. ''', (username, password))
  156. return True
  157. def new_session(user_id):
  158. connect()
  159. session_id = str(uuid.uuid4())
  160. cursor.execute('''
  161. INSERT INTO SESSIONS
  162. (user_id, session_id)
  163. VALUES (? , ?)
  164. ''', (user_id[0], session_id))
  165. return session_id
  166. def drop_old_sessions():
  167. connect()
  168. # TODO: test
  169. cursor.execute('''
  170. DELETE FROM sessions s1
  171. WHERE
  172. (SELECT COUNT(*) as newer
  173. FROM sessions s2
  174. WHERE s1.user_id = s2.user_id
  175. AND s1.rowid < s2.rowid) >= 10
  176. ''')
  177. def user_exists(username):
  178. connect()
  179. cursor.execute('''
  180. SELECT rowid
  181. FROM users
  182. WHERE username = ?
  183. ''', (username,))
  184. if cursor.fetchone():
  185. return True
  186. else:
  187. return False
  188. def move_money(username):
  189. connect()
  190. cursor.execute()