123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- import time
- from decimal import Decimal
- from db import DB, DBBit, DBDataException, DBDoneException
- from tool.type_ import *
- from tool.time_ import HGSTime
- from core.garbage import GarbageBag, GarbageType
- class GarbageDBException(DBDataException):
- ...
- def countGarbageByTime(uid: uid_t, db: DB):
- ti: time_t = time.time()
- start = ti - 3.5 * 24 * 60 * 60 # 前后3.5天
- end = ti + 3.5 * 24 * 60 * 60
- cur = db.search(f"SELECT gid FROM garbage_time WHERE uid = '{uid}' AND use_time BETWEEN {start} AND {end};")
- if cur is None:
- return -1
- return cur.rowcount
- def __find_garbage(sql: str, res_len, db: DB):
- cur = db.search(sql)
- if cur is None or cur.rowcount == 0:
- return [None, tuple()]
- assert cur.rowcount == 1
- res = cur.fetchone()
- assert len(res) == res_len
- return GarbageBag(str(res[0])), res
- def find_not_use_garbage(gid: gid_t, db: DB) -> Union[GarbageBag, None]:
- return __find_garbage(f"SELECT gid FROM garbage_n WHERE gid = {gid};", 1, db)[0]
- def find_wait_garbage(gid: gid_t, db: DB) -> Union[GarbageBag, None]:
- res: Tuple[int, bytes, Decimal, str, str]
- gb: GarbageBag
- gb, res = __find_garbage(f"SELECT gid, type, use_time, uid, loc FROM garbage_c WHERE gid = {gid};", 5, db)
- if gb is None:
- return None
- garbage_type: enum = int(res[1].decode())
- use_time: time_t = float(res[2])
- uid: uid_t = res[3]
- loc: location_t = res[4]
- gb.config_use(garbage_type, use_time, uid, loc)
- return gb
- def find_use_garbage(gid: gid_t, db: DB) -> Union[GarbageBag, None]:
- res: Tuple[int, bytes, Decimal, str, str, bytes]
- gb: GarbageBag
- gb, res = __find_garbage(f"SELECT gid, type, use_time, uid, loc, right_use, check_uid "
- f"FROM garbage_u WHERE gid = {gid};", 7, db)
- if gb is None:
- return None
- garbage_type: enum = int(res[1].decode())
- use_time: time_t = float(res[2])
- uid: uid_t = res[3]
- loc: location_t = res[4]
- check: bool = res[5] == DBBit.BIT_1
- check_uid: uid_t = res[6]
- gb.config_use(garbage_type, use_time, uid, loc)
- gb.config_check(check, check_uid)
- return gb
- def find_garbage(gid: gid_t, db: DB) -> Union[GarbageBag, None]:
- res: Tuple[bool, int] = is_garbage_exists(gid, db)
- if not res[0]:
- return None
- elif res[1] == 0:
- re = find_not_use_garbage(gid, db)
- elif res[1] == 1:
- re = find_wait_garbage(gid, db)
- elif res[1] == 2:
- re = find_use_garbage(gid, db)
- else:
- re = None
- assert re is not None
- return re
- def is_garbage_exists(gid: gid_t, db: DB) -> Tuple[bool, int]:
- cur = db.search(f"SELECT gid, flat FROM garbage WHERE gid = {gid};")
- if cur is None or cur.rowcount == 0:
- return False, 0
- assert cur.rowcount == 1
- res: Tuple[int, int] = cur.fetchone()
- return True, res[1]
- def update_garbage(garbage: GarbageBag, db: DB) -> bool:
- re = find_garbage(garbage.get_gid(), db)
- if re is None:
- return False
- if re.is_use() and not garbage.is_use() or re.is_check()[0] and not garbage.is_check():
- return False
- if not garbage.is_use() and not garbage.is_check()[0]:
- return True # 不做任何修改
- gid = garbage.get_gid()
- info = garbage.get_info()
- try:
- db.done_(f"DELETE FROM garbage_n WHERE gid = {gid};")
- db.done_(f"DELETE FROM garbage_c WHERE gid = {gid};")
- db.done_(f"DELETE FROM garbage_u WHERE gid = {gid};")
- if garbage.is_check()[0]:
- db.done_(f"UPDATE garbage SET flat = 2 WHERE gid = {gid};")
- db.done_(f"INSERT INTO garbage_u(gid, uid, use_time, type, loc, right_use, check_uid) "
- f"VALUES ({info['gid']} , '{info['user']}' , {info['use_time']}, {info['type']}, "
- f" '{info['loc']}', {info['check']}, '{info['checker']}');")
- else:
- db.done_(f"UPDATE garbage SET flat = 1 WHERE gid = {gid};")
- db.done_(f"INSERT INTO garbage_c(gid, uid, use_time, type, loc) "
- f"VALUES ({info['gid']} , '{info['user']}', {info['use_time']}, {info['type']}, "
- f" '{info['loc']}');")
- except DBDoneException:
- return False
- finally:
- db.done_commit()
- return True
- def creat_new_garbage(db: DB) -> Optional[GarbageBag]:
- cur = db.done("INSERT INTO garbage() VALUES ();")
- if cur is None:
- return None
- assert cur.rowcount == 1
- gid = cur.lastrowid
- cur = db.done(f"INSERT INTO garbage_n(gid) VALUES ({gid});")
- if cur is None:
- return None
- assert cur.rowcount == 1
- return GarbageBag(str(gid))
- def del_garbage_not_use(gid: gid_t, db: DB) -> bool:
- cur = db.done(f"DELETE FROM garbage_n WHERE gid = {gid};")
- if cur is None or cur.rowcount == 0:
- return False
- assert cur.rowcount == 1
- cur = db.done(f"DELETE FROM garbage WHERE gid = {gid};")
- if cur is None or cur.rowcount == 0:
- return False
- assert cur.rowcount == 1
- return True
- def del_garbage_not_use_many(gid_from: gid_t, gid_to: gid_t, db: DB) -> int:
- cur = db.done(f"DELETE FROM garbage "
- f"WHERE gid IN (SELECT gid FROM garbage_n WHERE gid BETWEEN {gid_from} and {gid_to});")
- if cur is None or cur.rowcount == 0:
- return 0
- cur = db.done(f"DELETE FROM garbage WHERE gid BETWEEN {gid_from} and {gid_to};")
- if cur is None or cur.rowcount == 0:
- return 0
- return cur.rowcount
- if __name__ == '__main__':
- mysql_db = DB()
- bag = creat_new_garbage(mysql_db)
- print(bag)
- bag.config_use(GarbageType.recyclable, HGSTime(), "1e1d30a1f9b78c8fa852d19b4cfaee79", "HuaDu")
- update_garbage(bag, mysql_db)
- print(bag)
- bag = find_garbage(bag.get_gid(), mysql_db)
- print(bag)
- bag.config_check(True, "048529ca5c6accf594b74e6f73ee1bf0")
- update_garbage(bag, mysql_db)
- print(bag)
- bag = find_garbage(bag.get_gid(), mysql_db)
- print(bag)
- print(countGarbageByTime("1e1d30a1f9b78c8fa852d19b4cfaee79", mysql_db))
|