garbage.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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 countGarbageByTime(uid: uid_t, db: DB):
  10. ti: time_t = time.time()
  11. start = ti - 3.5 * 24 * 60 * 60 # 前后3.5天
  12. end = ti + 3.5 * 24 * 60 * 60
  13. cur = db.search(f"SELECT gid FROM garbage_time WHERE uid = '{uid}' AND use_time BETWEEN {start} AND {end};")
  14. if cur is None:
  15. return -1
  16. return cur.rowcount
  17. def __find_garbage(sql: str, res_len, db: DB):
  18. cur = db.search(sql)
  19. if cur is None or cur.rowcount == 0:
  20. return [None, tuple()]
  21. assert cur.rowcount == 1
  22. res = cur.fetchone()
  23. assert len(res) == res_len
  24. return GarbageBag(str(res[0])), res
  25. def find_not_use_garbage(gid: gid_t, db: DB) -> Union[GarbageBag, None]:
  26. return __find_garbage(f"SELECT gid FROM garbage_n WHERE gid = {gid};", 1, db)[0]
  27. def find_wait_garbage(gid: gid_t, db: DB) -> Union[GarbageBag, None]:
  28. res: Tuple[int, bytes, Decimal, str, str]
  29. gb: GarbageBag
  30. gb, res = __find_garbage(f"SELECT gid, type, use_time, uid, loc FROM garbage_c WHERE gid = {gid};", 5, db)
  31. if gb is None:
  32. return None
  33. garbage_type: enum = int(res[1].decode())
  34. use_time: time_t = float(res[2])
  35. uid: uid_t = res[3]
  36. loc: location_t = res[4]
  37. gb.config_use(garbage_type, use_time, uid, loc)
  38. return gb
  39. def find_use_garbage(gid: gid_t, db: DB) -> Union[GarbageBag, None]:
  40. res: Tuple[int, bytes, Decimal, str, str, bytes]
  41. gb: GarbageBag
  42. gb, res = __find_garbage(f"SELECT gid, type, use_time, uid, loc, right_use, check_uid "
  43. f"FROM garbage_u WHERE gid = {gid};", 7, db)
  44. if gb is None:
  45. return None
  46. garbage_type: enum = int(res[1].decode())
  47. use_time: time_t = float(res[2])
  48. uid: uid_t = res[3]
  49. loc: location_t = res[4]
  50. check: bool = res[5] == DBBit.BIT_1
  51. check_uid: uid_t = res[6]
  52. gb.config_use(garbage_type, use_time, uid, loc)
  53. gb.config_check(check, check_uid)
  54. return gb
  55. def find_garbage(gid: gid_t, db: DB) -> Union[GarbageBag, None]:
  56. res: Tuple[bool, int] = is_garbage_exists(gid, db)
  57. if not res[0]:
  58. return None
  59. elif res[1] == 0:
  60. re = find_not_use_garbage(gid, db)
  61. elif res[1] == 1:
  62. re = find_wait_garbage(gid, db)
  63. elif res[1] == 2:
  64. re = find_use_garbage(gid, db)
  65. else:
  66. re = None
  67. assert re is not None
  68. return re
  69. def is_garbage_exists(gid: gid_t, db: DB) -> Tuple[bool, int]:
  70. cur = db.search(f"SELECT gid, flat FROM garbage WHERE gid = {gid};")
  71. if cur is None or cur.rowcount == 0:
  72. return False, 0
  73. assert cur.rowcount == 1
  74. res: Tuple[int, int] = cur.fetchone()
  75. return True, res[1]
  76. def update_garbage(garbage: GarbageBag, db: DB) -> bool:
  77. re = find_garbage(garbage.get_gid(), db)
  78. if re is None:
  79. return False
  80. if re.is_use() and not garbage.is_use() or re.is_check()[0] and not garbage.is_check():
  81. return False
  82. if not garbage.is_use() and not garbage.is_check()[0]:
  83. return True # 不做任何修改
  84. gid = garbage.get_gid()
  85. info = garbage.get_info()
  86. try:
  87. db.done_(f"DELETE FROM garbage_n WHERE gid = {gid};")
  88. db.done_(f"DELETE FROM garbage_c WHERE gid = {gid};")
  89. db.done_(f"DELETE FROM garbage_u WHERE gid = {gid};")
  90. if garbage.is_check()[0]:
  91. db.done_(f"UPDATE garbage SET flat = 2 WHERE gid = {gid};")
  92. db.done_(f"INSERT INTO garbage_u(gid, uid, use_time, type, loc, right_use, check_uid) "
  93. f"VALUES ({info['gid']} , '{info['user']}' , {info['use_time']}, {info['type']}, "
  94. f" '{info['loc']}', {info['check']}, '{info['checker']}');")
  95. else:
  96. db.done_(f"UPDATE garbage SET flat = 1 WHERE gid = {gid};")
  97. db.done_(f"INSERT INTO garbage_c(gid, uid, use_time, type, loc) "
  98. f"VALUES ({info['gid']} , '{info['user']}', {info['use_time']}, {info['type']}, "
  99. f" '{info['loc']}');")
  100. except DBDoneException:
  101. return False
  102. finally:
  103. db.done_commit()
  104. return True
  105. def creat_new_garbage(db: DB) -> Optional[GarbageBag]:
  106. cur = db.done("INSERT INTO garbage() VALUES ();")
  107. if cur is None:
  108. return None
  109. assert cur.rowcount == 1
  110. gid = cur.lastrowid
  111. cur = db.done(f"INSERT INTO garbage_n(gid) VALUES ({gid});")
  112. if cur is None:
  113. return None
  114. assert cur.rowcount == 1
  115. return GarbageBag(str(gid))
  116. def del_garbage_not_use(gid: gid_t, db: DB) -> bool:
  117. cur = db.done(f"DELETE FROM garbage_n WHERE gid = {gid};")
  118. if cur is None or cur.rowcount == 0:
  119. return False
  120. assert cur.rowcount == 1
  121. cur = db.done(f"DELETE FROM garbage WHERE gid = {gid};")
  122. if cur is None or cur.rowcount == 0:
  123. return False
  124. assert cur.rowcount == 1
  125. return True
  126. def del_garbage_not_use_many(gid_from: gid_t, gid_to: gid_t, db: DB) -> int:
  127. cur = db.done(f"DELETE FROM garbage "
  128. f"WHERE gid IN (SELECT gid FROM garbage_n WHERE gid BETWEEN {gid_from} and {gid_to});")
  129. if cur is None or cur.rowcount == 0:
  130. return 0
  131. cur = db.done(f"DELETE FROM garbage WHERE gid BETWEEN {gid_from} and {gid_to};")
  132. if cur is None or cur.rowcount == 0:
  133. return 0
  134. return cur.rowcount
  135. if __name__ == '__main__':
  136. mysql_db = DB()
  137. bag = creat_new_garbage(mysql_db)
  138. print(bag)
  139. bag.config_use(GarbageType.recyclable, HGSTime(), "1e1d30a1f9b78c8fa852d19b4cfaee79", "HuaDu")
  140. update_garbage(bag, mysql_db)
  141. print(bag)
  142. bag = find_garbage(bag.get_gid(), mysql_db)
  143. print(bag)
  144. bag.config_check(True, "048529ca5c6accf594b74e6f73ee1bf0")
  145. update_garbage(bag, mysql_db)
  146. print(bag)
  147. bag = find_garbage(bag.get_gid(), mysql_db)
  148. print(bag)
  149. print(countGarbageByTime("1e1d30a1f9b78c8fa852d19b4cfaee79", mysql_db))