garbage.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. import time
  2. from decimal import Decimal
  3. from db import DB, DBBit, DBDataException, DBDoneException
  4. from tool.type_ import *
  5. from tool.time_ import HGSTime
  6. from core.garbage import GarbageBag, GarbageType
  7. class GarbageDBException(DBDataException):
  8. ...
  9. def search_from_garbage_view(columns, where: str, db: DB):
  10. if len(where) > 0:
  11. where = f"WHERE {where} "
  12. column = ", ".join(columns)
  13. cur = db.search(f"SELECT {column} FROM garbage_view {where};")
  14. if cur is None:
  15. return None
  16. res = cur.fetchall()
  17. return res
  18. def count_garbage_by_time(uid: uid_t, db: DB):
  19. ti: time_t = time.time()
  20. start = ti - 3.5 * 24 * 60 * 60 # 前后3.5天
  21. end = ti + 3.5 * 24 * 60 * 60
  22. cur = db.search(f"SELECT gid FROM garbage_time WHERE uid = '{uid}' AND use_time BETWEEN {start} AND {end};")
  23. if cur is None:
  24. return -1
  25. return cur.rowcount
  26. def __find_garbage(sql: str, res_len, db: DB):
  27. cur = db.search(sql)
  28. if cur is None or cur.rowcount == 0:
  29. return [None, tuple()]
  30. assert cur.rowcount == 1
  31. res = cur.fetchone()
  32. assert len(res) == res_len
  33. return GarbageBag(str(res[0])), res
  34. def find_not_use_garbage(gid: gid_t, db: DB) -> Union[GarbageBag, None]:
  35. return __find_garbage(f"SELECT gid FROM garbage_n WHERE gid = {gid};", 1, db)[0]
  36. def find_wait_garbage(gid: gid_t, db: DB) -> Union[GarbageBag, None]:
  37. res: Tuple[int, bytes, Decimal, str, str]
  38. gb: GarbageBag
  39. gb, res = __find_garbage(f"SELECT gid, type, use_time, uid, loc FROM garbage_c WHERE gid = {gid};", 5, db)
  40. if gb is None:
  41. return None
  42. garbage_type: enum = int(res[1].decode())
  43. use_time: time_t = float(res[2])
  44. uid: uid_t = res[3]
  45. loc: location_t = res[4]
  46. gb.config_use(garbage_type, use_time, uid, loc)
  47. return gb
  48. def find_use_garbage(gid: gid_t, db: DB) -> Union[GarbageBag, None]:
  49. res: Tuple[int, bytes, Decimal, str, str, bytes]
  50. gb: GarbageBag
  51. gb, res = __find_garbage(f"SELECT gid, type, use_time, uid, loc, right_use, check_uid "
  52. f"FROM garbage_u WHERE gid = {gid};", 7, db)
  53. if gb is None:
  54. return None
  55. garbage_type: enum = int(res[1].decode())
  56. use_time: time_t = float(res[2])
  57. uid: uid_t = res[3]
  58. loc: location_t = res[4]
  59. check: bool = res[5] == DBBit.BIT_1
  60. check_uid: uid_t = res[6]
  61. gb.config_use(garbage_type, use_time, uid, loc)
  62. gb.config_check(check, check_uid)
  63. return gb
  64. def find_garbage(gid: gid_t, db: DB) -> Union[GarbageBag, None]:
  65. res: Tuple[bool, int] = is_garbage_exists(gid, db)
  66. if not res[0]:
  67. return None
  68. elif res[1] == 0:
  69. re = find_not_use_garbage(gid, db)
  70. elif res[1] == 1:
  71. re = find_wait_garbage(gid, db)
  72. elif res[1] == 2:
  73. re = find_use_garbage(gid, db)
  74. else:
  75. re = None
  76. assert re is not None
  77. return re
  78. def is_garbage_exists(gid: gid_t, db: DB) -> Tuple[bool, int]:
  79. cur = db.search(f"SELECT gid, flat FROM garbage WHERE gid = {gid};")
  80. if cur is None or cur.rowcount == 0:
  81. return False, 0
  82. assert cur.rowcount == 1
  83. res: Tuple[int, int] = cur.fetchone()
  84. return True, res[1]
  85. def update_garbage(garbage: GarbageBag, db: DB) -> bool:
  86. re = find_garbage(garbage.get_gid(), db)
  87. if re is None:
  88. return False
  89. if re.is_use() and not garbage.is_use() or re.is_check()[0] and not garbage.is_check():
  90. return False
  91. if not garbage.is_use() and not garbage.is_check()[0]:
  92. return True # 不做任何修改
  93. gid = garbage.get_gid()
  94. info = garbage.get_info()
  95. try:
  96. db.done_(f"DELETE FROM garbage_n WHERE gid = {gid};")
  97. db.done_(f"DELETE FROM garbage_c WHERE gid = {gid};")
  98. db.done_(f"DELETE FROM garbage_u WHERE gid = {gid};")
  99. if garbage.is_check()[0]:
  100. db.done_(f"UPDATE garbage SET flat = 2 WHERE gid = {gid};")
  101. db.done_(f"INSERT INTO garbage_u(gid, uid, use_time, type, loc, right_use, check_uid) "
  102. f"VALUES ({info['gid']} , '{info['user']}' , {info['use_time']}, {info['type']}, "
  103. f" '{info['loc']}', {info['check']}, '{info['checker']}');")
  104. else:
  105. db.done_(f"UPDATE garbage SET flat = 1 WHERE gid = {gid};")
  106. db.done_(f"INSERT INTO garbage_c(gid, uid, use_time, type, loc) "
  107. f"VALUES ({info['gid']} , '{info['user']}', {info['use_time']}, {info['type']}, "
  108. f" '{info['loc']}');")
  109. except DBDoneException:
  110. return False
  111. finally:
  112. db.done_commit()
  113. return True
  114. def create_new_garbage(db: DB) -> Optional[GarbageBag]:
  115. cur = db.done("INSERT INTO garbage() VALUES ();")
  116. if cur is None:
  117. return None
  118. assert cur.rowcount == 1
  119. gid = cur.lastrowid
  120. cur = db.done(f"INSERT INTO garbage_n(gid) VALUES ({gid});")
  121. if cur is None:
  122. return None
  123. assert cur.rowcount == 1
  124. return GarbageBag(str(gid))
  125. def del_garbage_core(gid: gid_t, db: DB, from_: str) -> bool:
  126. cur = db.done(f"DELETE FROM {from_} WHERE gid = {gid};")
  127. if cur is None or cur.rowcount == 0:
  128. return False
  129. assert cur.rowcount == 1
  130. cur = db.done(f"DELETE FROM garbage WHERE gid = {gid};")
  131. if cur is None or cur.rowcount == 0:
  132. return False
  133. assert cur.rowcount == 1
  134. return True
  135. def del_garbage_not_use(gid: gid_t, db: DB) -> bool:
  136. return del_garbage_core(gid, db, "garbage_n")
  137. def del_garbage_wait_check(gid: gid_t, db: DB) -> bool:
  138. return del_garbage_core(gid, db, "garbage_c")
  139. def del_garbage_has_check(gid: gid_t, db: DB) -> bool:
  140. return del_garbage_core(gid, db, "garbage_u")
  141. def del_garbage(gid, db: DB):
  142. res = del_garbage_not_use(gid, db)
  143. if res:
  144. return True
  145. res = del_garbage_wait_check(gid, db)
  146. if res:
  147. return True
  148. return del_garbage_has_check(gid, db)
  149. def del_garbage_where_core(where, db: DB, from_: str, from_int: int) -> int:
  150. cur = db.done_(f"DELETE FROM {from_} WHERE {where};")
  151. if cur is None:
  152. return -1
  153. elif cur.rowcount == 0:
  154. return 0
  155. cur = db.done(f"DELETE FROM garbage WHERE flat={from_int} AND gid NOT IN (SELECT gid FROM {from_});")
  156. if cur is None:
  157. return -1
  158. return cur.rowcount
  159. def del_garbage_where_not_use(where, db: DB) -> int:
  160. return del_garbage_where_core(where, db, "garbage_n", 0)
  161. def del_garbage_where_wait_check(where, db: DB) -> int:
  162. return del_garbage_where_core(where, db, "garbage_c", 1)
  163. def del_garbage_where_has_check(where, db: DB) -> int:
  164. return del_garbage_where_core(where, db, "garbage_u", 2)
  165. def del_garbage_where_scan_core(where, db: DB, from_: str) -> int:
  166. cur = db.done(f"SELECT gid FROM {from_} WHERE {where};")
  167. if cur is None:
  168. return -1
  169. return cur.rowcount
  170. def del_garbage_where_scan_not_use(where, db: DB) -> int:
  171. return del_garbage_where_scan_core(where, db, "garbage_n")
  172. def del_garbage_where_scan_wait_check(where, db: DB) -> int:
  173. return del_garbage_where_scan_core(where, db, "garbage_c")
  174. def del_garbage_where_scan_has_check(where, db: DB) -> int:
  175. return del_garbage_where_scan_core(where, db, "garbage_u")
  176. def del_all_garbage(db: DB) -> int:
  177. cur = db.done(f"DELETE FROM garbage_u WHERE 1;")
  178. if cur is None:
  179. return -1
  180. cur = db.done(f"DELETE FROM garbage_c WHERE 1;")
  181. if cur is None:
  182. return -1
  183. cur = db.done(f"DELETE FROM garbage_n WHERE 1;")
  184. if cur is None:
  185. return -1
  186. cur = db.done(f"DELETE FROM garbage WHERE 1;")
  187. if cur is None:
  188. return -1
  189. return cur.rowcount
  190. def del_all_garbage_scan(db: DB) -> int:
  191. cur = db.done(f"SELECT gid FROM garbage WHERE 1;")
  192. if cur is None:
  193. return -1
  194. return cur.rowcount
  195. def del_garbage_not_use_many(gid_from: gid_t, gid_to: gid_t, db: DB) -> int:
  196. cur = db.done(f"DELETE FROM garbage "
  197. f"WHERE gid IN (SELECT gid FROM garbage_n WHERE gid BETWEEN {gid_from} and {gid_to});")
  198. if cur is None or cur.rowcount == 0:
  199. return 0
  200. cur = db.done(f"DELETE FROM garbage WHERE gid BETWEEN {gid_from} and {gid_to};")
  201. if cur is None or cur.rowcount == 0:
  202. return 0
  203. return cur.rowcount
  204. if __name__ == '__main__':
  205. mysql_db = DB()
  206. bag = create_new_garbage(mysql_db)
  207. print(bag)
  208. bag.config_use(GarbageType.recyclable, HGSTime(), "1e1d30a1f9b78c8fa852d19b4cfaee79", "HuaDu")
  209. update_garbage(bag, mysql_db)
  210. print(bag)
  211. bag = find_garbage(bag.get_gid(), mysql_db)
  212. print(bag)
  213. bag.config_check(True, "048529ca5c6accf594b74e6f73ee1bf0")
  214. update_garbage(bag, mysql_db)
  215. print(bag)
  216. bag = find_garbage(bag.get_gid(), mysql_db)
  217. print(bag)
  218. print(count_garbage_by_time("1e1d30a1f9b78c8fa852d19b4cfaee79", mysql_db))