From f50748715cce1a69ad88c1b49b8286ba0667ad8c Mon Sep 17 00:00:00 2001 From: Mihir Patel Date: Sat, 4 Feb 2023 17:28:46 -0500 Subject: [PATCH 1/4] initnp --- pydb.py | 5 ++- server.py | 93 ++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 84 insertions(+), 14 deletions(-) diff --git a/pydb.py b/pydb.py index 26702a8..94a7a35 100644 --- a/pydb.py +++ b/pydb.py @@ -1,9 +1,10 @@ -#database file +# database file import sqlite3 as sql DBNAME = "stockDB" + def initDB(): db = sql.connect(DBNAME) print("Database " + DBNAME + " created") @@ -31,5 +32,3 @@ def initDB(): FOREIGN KEY (user_id) REFERENCES Users (ID) ); ''') print("Stocks table created in database") - - diff --git a/server.py b/server.py index eefe907..99c07e6 100644 --- a/server.py +++ b/server.py @@ -1,4 +1,4 @@ -#server +# server import socket import sqlite3 as sql @@ -6,39 +6,44 @@ import pydb -#setup port as last 4 of umid and address setup as a pair +# setup port as last 4 of umid and address setup as a pair PORT = 8414 serverAddress = ("localhost", PORT) status = False MSGLEN = 32 DBNAME = "stockDB" -#create server socket +# create server socket serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -#test connection with serverAddress - error if it doesn't work and exit program +# test connection with serverAddress - error if it doesn't work and exit program try: serverSocket.bind(serverAddress) status = True serverSocket.listen(5) - print(f"Server started on {serverAddress[0]} and is listening on port {serverAddress[1]}\n") + print( + f"Server started on {serverAddress[0]} and is listening on port {serverAddress[1]}\n") except Exception as e: - print(f"Server failed to start on {serverAddress[0]}:{serverAddress[1]} \nException is" + str(e) + "\nProgram exiting...") + print(f"Server failed to start on {serverAddress[0]}:{serverAddress[1]} \nException is" + str( + e) + "\nProgram exiting...") -#connect to DB +# connect to DB if not os.path.isfile(DBNAME): pydb.initDB() db = sql.connect(DBNAME) print("Connected to database: " + DBNAME) cur = db.cursor() + def shutdown(): global status status = False print("Server shutting down...") serverSocket.close() -#sends input string to client of max length MSGLEN +# sends input string to client of max length MSGLEN + + def sendMsg(msg): totalSent = 0 while len(msg) < MSGLEN: @@ -53,7 +58,9 @@ def sendMsg(msg): totalSent += sent print("msg '" + msg.strip() + "' sent with total bytes: " + str(totalSent)) -#recieves string from client +# recieves string from client + + def recieveMsg(): chunks = [] bytesRecieved = 0 @@ -71,7 +78,64 @@ def recieveMsg(): returnStr = returnStr + c.decode("utf-8") return returnStr.strip() -#main server loop - accept connection - runs command loop until quit or shutdown is recieved + +def buy_stock(ticker, name, quantity, user_id, stock_price): + # Check if user has sufficient funds + query = "SELECT usd_balance FROM Users WHERE ID = ?" + cur.execute(query, (user_id,)) + balance = cur.fetchone()[0] + if balance < quantity * stock_price: + raise Exception("Insufficient funds") + + # Update stock quantity + query = "SELECT user_id FROM Stocks WHERE stock_symbol = ?" + cur.execute(query, (ticker)) + stock = cur.fetchone() + if stock is not None: + query = "UPDATE Stocks SET stock_balance = stock_balance + ? WHERE ticker = ?" + cur.execute(query, (quantity, ticker)) + query = "INSERT INTO Stocks (stock_symbol, stock_name, stock_balance) VALUES (?, ?, ?)" + cur.execute(query, (ticker, name, quantity)) + + # Update user balance + query = "UPDATE Users SET usd_balance = usd_balance - ? WHERE ID = ?" + cur.execute(query, (quantity * stock_price, user_id)) + + db.commit() + + +def sell_stock(ticker, quantity, user_id, stock_price): + query = "SELECT quantity FROM Stocks WHERE stock_symbol = ? AND user_id = ?" + cur.execute(query, (ticker, user_id)) + stock_balance = cur.fetchone()[0] + if stock_balance < quantity: + raise Exception("Insufficient stock quantity") + + # Update stock quantity + query = "UPDATE Stocks SET stock_balance = stock_balance - ? WHERE stock_symbol = ? AND user_id = ?" + cur.execute(query, (quantity, ticker, user_id)) + + # Update user balance + query = "UPDATE Users SET usd_balance = usd_balance + ? WHERE ID = ?" + cur.execute(query, (quantity * stock_price, user_id)) + + db.commit() + + +def balance(user_id): + query = "SELECT usd_balance FROM Users WHERE ID = ?" + cur.execute(query, (user_id,)) + balance = cur.fetchall() + return balance + db.commit() + + +def list_stocks(user_id): + query = "SELECT stock_name FROM Stocks WHERE user_id = ?" + db.commit() + + +# main server loop - accept connection - runs command loop until quit or shutdown is recieved while status: (clientSocket, clientAddr) = serverSocket.accept() print(f"Connection accepted from {clientAddr[0]}:{clientAddr[1]}\n") @@ -84,4 +148,11 @@ def recieveMsg(): shutdown() elif msg.lower() == "quit".lower(): client = False - \ No newline at end of file + elif msg.lower() == "buy".lower(): + buy_stock() + elif msg.lower() == "sell".lower(): + sell_stock() + elif msg.lower() == "balance".lower(): + balance(1) + elif msg.lower() == "list".lower(): + list_stocks() From 4ad69e242f9e9eb1513f3bd4c4c868d76c654025 Mon Sep 17 00:00:00 2001 From: Mihir Patel Date: Sat, 4 Feb 2023 18:07:05 -0500 Subject: [PATCH 2/4] init --- server.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server.py b/server.py index 99c07e6..216bfbe 100644 --- a/server.py +++ b/server.py @@ -132,6 +132,8 @@ def balance(user_id): def list_stocks(user_id): query = "SELECT stock_name FROM Stocks WHERE user_id = ?" + cur.execute(query,(user_id)) + db.commit() From bf04c7ee6cc385eed5e5c80f9c16d04908b8eefd Mon Sep 17 00:00:00 2001 From: Mihir Patel Date: Thu, 9 Feb 2023 18:01:07 -0500 Subject: [PATCH 3/4] Updated to pass arguments in buy, sell functions --- __pycache__/pydb.cpython-310.pyc | Bin 0 -> 1166 bytes client.py | 39 ++++++++++++++++++++----------- server.py | 22 ++++++++++------- stockDB | Bin 0 -> 16384 bytes 4 files changed, 39 insertions(+), 22 deletions(-) create mode 100644 __pycache__/pydb.cpython-310.pyc create mode 100644 stockDB diff --git a/__pycache__/pydb.cpython-310.pyc b/__pycache__/pydb.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c1c811b3cd66582cb877106c64e58c8a57c2f22 GIT binary patch literal 1166 zcmbtT&5zPR6rZ+y3&xw?oFh%pgP(~SBha!|p%6Y2mym2qXIvZm!Ol#x3)wyC9|A}J zArC#77!Upno_y^BOG)J7OXg+X_q^Y{7gQ=G1oZvv_xS==&q()6R{2efXmXeTH(iIXAF66t2 z!1*Fc=n^e6D|97YO3N%!R-gfoOk#;O*|jDYYY2kEd2>YooSz4btkZA1 z*lh@hoSaN8*Ya(O0Tp+fZ0jChQX%R~ytsdj4M6JB4V-`lCTo+wyiykt{u0ZaM*1Zr@cJMk2qvA4z<*4THU^G9GS^TRM(y=?&~eR zubWMMGiX&qQxBt#*RcH)b~P6%{LGE=cHsNe7Ew-XnDvexWoHZ~HOko`;{l8E^n%)< zpsF0nWEv@;{)X5s*t$Q@nlC2F=T1E5lfx!jV22*{1)m%_;%zvcG>yTNN6#PhSa8ZL zZ!(*c>BHGP$~nFxv_>Ib-`l`S(jBQFm*hgRB$tb<0xC5FtAFM?f<9*Ps> ") if cmd[0:8].lower() == "balance".lower(): sendMsg(cmd) - #does nothing yet + # does nothing yet + elif cmd.lower() == "buy": + sendMsg(cmd) elif cmd.lower() == "shutdown".lower(): sendMsg(cmd) print("Shutting down server...") quitClient() elif cmd.lower() == "quit".lower(): sendMsg("quit") - quitClient() \ No newline at end of file + quitClient() diff --git a/server.py b/server.py index 216bfbe..312ea0c 100644 --- a/server.py +++ b/server.py @@ -81,6 +81,7 @@ def recieveMsg(): def buy_stock(ticker, name, quantity, user_id, stock_price): # Check if user has sufficient funds + print("Buy success") query = "SELECT usd_balance FROM Users WHERE ID = ?" cur.execute(query, (user_id,)) balance = cur.fetchone()[0] @@ -110,7 +111,6 @@ def sell_stock(ticker, quantity, user_id, stock_price): stock_balance = cur.fetchone()[0] if stock_balance < quantity: raise Exception("Insufficient stock quantity") - # Update stock quantity query = "UPDATE Stocks SET stock_balance = stock_balance - ? WHERE stock_symbol = ? AND user_id = ?" cur.execute(query, (quantity, ticker, user_id)) @@ -123,6 +123,7 @@ def sell_stock(ticker, quantity, user_id, stock_price): def balance(user_id): + UI = pydb.getUserInfo(5) query = "SELECT usd_balance FROM Users WHERE ID = ?" cur.execute(query, (user_id,)) balance = cur.fetchall() @@ -132,8 +133,9 @@ def balance(user_id): def list_stocks(user_id): query = "SELECT stock_name FROM Stocks WHERE user_id = ?" - cur.execute(query,(user_id)) - + cur.execute(query, (user_id)) + stocks = cur.fetchall() + return stocks db.commit() @@ -150,11 +152,15 @@ def list_stocks(user_id): shutdown() elif msg.lower() == "quit".lower(): client = False - elif msg.lower() == "buy".lower(): - buy_stock() - elif msg.lower() == "sell".lower(): - sell_stock() + elif msg[0:3].lower() == "buy".lower(): + arguments = msg.split(',') + function_arguments = arguments[1:] + buy_stock(*function_arguments) + elif msg[0:3].lower() == "sell".lower(): + arguments = msg.split(',') + function_arguments = arguments[1:] + sell_stock(*function_arguments) elif msg.lower() == "balance".lower(): balance(1) elif msg.lower() == "list".lower(): - list_stocks() + list_stocks(1) diff --git a/stockDB b/stockDB new file mode 100644 index 0000000000000000000000000000000000000000..081d49ebe182d10e9ed41f91c815f31bdf793d43 GIT binary patch literal 16384 zcmeI#&riZI6bJAPh$bcw6AufwcZ5K^c=aGcF;f^gMhK^6KrzI@WF1kjME@}VGt2n7 zsl>#KA>St3=-R%$ejb;$?rWof)6nzBPCysRsiLaN6_KJS33;XDwQljgx*pi`Oep7_ z+q9gJOrI&4kBlcDXb^w^1Rwwb2tWV=5P$##{)@o8n>^OCS@k^~I6arQ04}WdZbrqGzs_v_sM8jWVCBFYMOezWOnI}b*a?08oD8))|p`y zqieUCjQKC7^&Hok^f~$5abt02g8TMpu+F%+yDzFXOs3x$ zVb;0T%siQ_%1maIS&Q0owV<3{$!|5}uSk%5GjXI93Tii$6;oH9J#E3KGcHq#b(0b6 z*kEq4+oD{VpI@rSnx?65oiJvYMR-d@)-SW$P3CWvitcMT@AOHafKmY;|fB*y_009U< z00IXrfb;(W7Z+QD00bZa0SG_<0uX=z1Rwwb2&@Ef{>NVd0uX=z1Rwwb2tWV=5P$## IAaM8spI@-bK>z>% literal 0 HcmV?d00001 From 91525522daec65690ff64b4b7eee211bef2acdc5 Mon Sep 17 00:00:00 2001 From: Mihir Patel Date: Fri, 10 Feb 2023 15:47:40 -0500 Subject: [PATCH 4/4] query = "SELECT quantity FROM user_stocks WHERE user_id = ? AND stock_id = ?" cursor.execute(query, (user_id, stock_id)) result = cursor.fetchone() if result is None: print("User does not hold the stock with ticker '{}'".format(ticker)) returnquery = "SELECT quantity FROM user_stocks WHERE user_id = ? AND stock_id = ?" cursor.execute(query, (user_id, stock_id)) result = cursor.fetchone() if result is None: print("User does not hold the stock with ticker '{}'".format(ticker)) returnquery = "SELECT quantity FROM user_stocks WHERE user_id = ? AND stock_id = ?" cursor.execute(query, (user_id, stock_id)) result = cursor.fetchone() if result is None: print("User does not hold the stock with ticker '{}'".format(ticker)) returnquery = "SELECT quantity FROM user_stocks WHERE user_id = ? AND stock_id = ?" cursor.execute(query, (user_id, stock_id)) result = cursor.fetchone() if result is None: print("User does not hold the stock with ticker '{}'".format(ticker)) returnquery = "SELECT quantity FROM user_stocks WHERE user_id = ? AND stock_id = ?" cursor.execute(query, (user_id, stock_id)) result = cursor.fetchone() if result is None: print("User does not hold the stock with ticker '{}'".format(ticker)) returnquery = "SELECT quantity FROM user_stocks WHERE user_id = ? AND stock_id = ?" cursor.execute(query, (user_id, stock_id)) result = cursor.fetchone() if result is None: print("User does not hold the stock with ticker '{}'".format(ticker)) return updated the buy sell functions --- server.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/server.py b/server.py index 312ea0c..b072dad 100644 --- a/server.py +++ b/server.py @@ -78,10 +78,8 @@ def recieveMsg(): returnStr = returnStr + c.decode("utf-8") return returnStr.strip() - -def buy_stock(ticker, name, quantity, user_id, stock_price): +def buy_stock(ticker, quantity, stock_price, user_id): # Check if user has sufficient funds - print("Buy success") query = "SELECT usd_balance FROM Users WHERE ID = ?" cur.execute(query, (user_id,)) balance = cur.fetchone()[0] @@ -93,10 +91,10 @@ def buy_stock(ticker, name, quantity, user_id, stock_price): cur.execute(query, (ticker)) stock = cur.fetchone() if stock is not None: - query = "UPDATE Stocks SET stock_balance = stock_balance + ? WHERE ticker = ?" + query = "UPDATE Stocks SET stock_balance = stock_balance + ? WHERE stock_symbol = ?" cur.execute(query, (quantity, ticker)) - query = "INSERT INTO Stocks (stock_symbol, stock_name, stock_balance) VALUES (?, ?, ?)" - cur.execute(query, (ticker, name, quantity)) + query = "INSERT INTO Stocks (stock_symbol, stock_balance) VALUES (?, ?)" + cur.execute(query, (ticker, quantity)) # Update user balance query = "UPDATE Users SET usd_balance = usd_balance - ? WHERE ID = ?" @@ -104,8 +102,14 @@ def buy_stock(ticker, name, quantity, user_id, stock_price): db.commit() - -def sell_stock(ticker, quantity, user_id, stock_price): +#Here we will need the stock price as well to update the balance when the user sells the stock: check line 122-124 +def sell_stock(ticker, quantity, stock_price, user_id): + query = "SELECT stock_balance FROM Stocks WHERE user_id = ? AND stock_symbol = ?" + cur.execute(query, (user_id, ticker)) + result = cur.fetchone() + if result is None: + print("User does not hold the stock with ticker '{}'".format(ticker)) + return query = "SELECT quantity FROM Stocks WHERE stock_symbol = ? AND user_id = ?" cur.execute(query, (ticker, user_id)) stock_balance = cur.fetchone()[0] @@ -153,11 +157,11 @@ def list_stocks(user_id): elif msg.lower() == "quit".lower(): client = False elif msg[0:3].lower() == "buy".lower(): - arguments = msg.split(',') + arguments = msg.split(' ') function_arguments = arguments[1:] buy_stock(*function_arguments) elif msg[0:3].lower() == "sell".lower(): - arguments = msg.split(',') + arguments = msg.split(' ') function_arguments = arguments[1:] sell_stock(*function_arguments) elif msg.lower() == "balance".lower():