practice_code/python/test/Server/Transmission/Database_formula.py
2024-04-20 17:36:36 +08:00

182 lines
7.7 KiB
Python

import os
import pymssql
import threading
import time
from .Process_Client import *
class database(ProcessClient):
def __init__(self):
ProcessClient.__init__(self)
self.database_server = 'localhost'
self.database_user = 'Chat'
self.database_password = '123456'
self.database_port = 8972
self.database_name = 'Chat'
self.database_state = False
self.database_conn = None
self.database_cursor = None
current_file_path = __file__
current_file_name = os.path.basename(current_file_path).split('.')[0]
self.Process_client_send("Server", "Name", current_file_name)
self.link_database_thread = threading.Thread(target=self.link_database)
self.link_database_thread.start()
# 创建一个互斥锁对象
self.lock = threading.Lock()
def link_database(self):
while not self.database_state:
time.sleep(1)
try:
self.database_conn = pymssql.connect(server=self.database_server,
user=self.database_user,
password=self.database_password,
port=self.database_port,
database=self.database_name)
self.database_cursor = self.database_conn.cursor()
self.database_state = True
except pymssql.Error as a:
print(a)
def check_account_state(self, client_id, Id: int, password):
if self.database_state:
try:
state = 2
self.database_cursor.execute(f"select Id,Password from Account where Id = {Id}")
request_data = self.database_cursor.fetchall()
if len(request_data) != 0:
if request_data[0][1] == password:
state = 0
else:
state = 1
content = {"account": Id, "status": state}
data = {"client_id": client_id, "target": "客户端", "genre": "登录", "data": content}
self.Process_client_send('Session_client', 'send_client', data)
except pymssql as a:
self.database_state = False
print(a)
def sign_account(self, client_id, NetName, Password):
if self.database_state:
# 获取锁
self.lock.acquire()
try:
self.database_cursor.execute("insert into Account(NetName, Password)"
f"values ('{NetName}','{Password}')")
self.database_conn.commit()
self.database_cursor.execute(f"SELECT SCOPE_IDENTITY() AS LastInsertedId;")
Id = self.database_cursor.fetchone()[0]
# 释放锁
self.lock.release()
info = {"Id": int(Id), "NetName": NetName, "Password": Password}
content = {"client_id": client_id, "target": "客户端", "genre": "注册", "data": info}
self.Process_client_send('Session_client', 'send_client', content)
except pymssql as a:
self.lock.release()
self.database_state = False
return False
def alter_state_database(self, Id: int, sate):
if self.database_state:
try:
self.database_cursor.execute(f"update Account set State = N'{sate}' where Id = {Id}")
self.database_conn.commit()
except pymssql as a:
self.database_state = False
print(a)
def detection_data(self, Id, date):
datas = []
self.database_cursor.execute(f"select Id,Password,NetName,UpDataTime from Account where Id = {Id}")
Account_database = self.database_cursor.fetchall()
Account_content = {'Id': Account_database[0][0],
'Password': Account_database[0][1],
'NetName': Account_database[0][2],
'UpDataTime': Account_database[0][3].strftime('%Y-%m-%d %H:%M:%S')}
if Account_content['UpDataTime'] == date:
content = {"client_id": Id, "target": "客户端", "genre": "数据更新", "data": {"更新完成": Id}}
self.Process_client_send('Session_client', 'send_client', content)
return
Account_data = {"Account": Account_content}
datas.append(Account_data)
self.database_cursor.execute(
f"select ContactsId,Remark,State,UpDataTime from Contacts where UserId = {Id} and UpDataTime > '{date}'")
Contacts_database = self.database_cursor.fetchall()
for Contact in Contacts_database:
Contacts_content = {'Contact': Contact[0],
'Remark': Contact[1],
'State': Contact[2],
'UpDataTime': Contact[3].strftime('%Y-%m-%d %H:%M:%S')}
Contacts_data = {"Contacts": Contacts_content}
datas.append(Contacts_data)
self.database_cursor.execute(f"select * from History where Send = {Id} or Receive = {Id} and Time > '{date}'")
History_database = self.database_cursor.fetchall()
for History in History_database:
content = {
'Send': History[0],
'Receive': History[1],
'Type': History[2],
'Content': History[3],
'Time': History[4].strftime('%Y-%m-%d %H:%M:%S')}
History_data = {"History": content}
datas.append(History_data)
datas.append({"更新完成": Id})
for data in datas:
time.sleep(0.1)
content = {"client_id": Id, "target": "客户端", "genre": "数据更新", "data": data}
self.Process_client_send('Session_client', 'send_client', content)
def update_History(self, Send, Receive, Type, Content, Time):
if self.database_state:
try:
self.database_cursor.execute(f"insert into History(Send, Receive, Type, Content,Time)"
f"select {Send},{Receive},'{Type}',N'{Content}','{Time}'")
self.database_conn.commit()
except pymssql as a:
self.database_state = False
print(a)
def Process_client_pick(self, data):
if data['target'] in ['ALL', 'Database_formula']:
match data['function']:
case 'check_account_state':
self.check_account_state(data['content']['client_id'],
data['content']['account'],
data['content']['password'])
case 'sign_account':
self.sign_account(data['content']['client_id'],
data['content']['account'],
data['content']['password'])
case 'alter_state_database':
self.alter_state_database(data['content']['Id'],
data['content']['sate'])
case 'detection_data':
self.detection_data(data['content']['client_id'],
data['content']['date'])
case 'update_History':
self.update_History(data['content']['Send'],
data['content']['Receive'],
data['content']['Type'],
data['content']['Content'],
data['content']['Time'])