Created
April 3, 2024 00:13
-
-
Save alirezaarzehgar/0a39b6643a6622712d34001f6dd7f08b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <fstream> | |
#include <string> | |
#include <vector> | |
using namespace std; | |
class Database { | |
fstream table; | |
public: | |
static vector<string> record2vector(string s) | |
{ | |
vector<string> out; | |
int pos = 0; | |
string token; | |
while ((pos = s.find(",")) != string::npos) { | |
token = s.substr(0, pos); | |
out.push_back(token); | |
s.erase(0, pos + 1); | |
} | |
out.push_back(s); | |
return out; | |
} | |
void reload() | |
{ | |
table.close(); | |
table.open(tablename, ios::out|ios::in|ios::app); | |
} | |
string tablename; | |
int init(string tblname) | |
{ | |
tablename = tblname+".csv"; | |
table.open(tablename, ios::out|ios::in|ios::app); | |
if (!table) | |
return -1; | |
return 0; | |
} | |
void create(string record) | |
{ | |
table.seekp(ios::end); | |
table << record << endl; | |
table.flush(); | |
} | |
vector<string> select(int index, string value) | |
{ | |
vector<string> out, vrec; | |
table.seekg(ios::beg); | |
string rec; | |
while(1) { | |
table >> rec; | |
if (table.eof()) | |
break; | |
vrec = record2vector(rec); | |
if (vrec[index] == value || index < 0) | |
out.push_back(rec); | |
} | |
reload(); | |
return out; | |
} | |
int update(int index, string value, string record) | |
{ | |
string text; | |
table.seekg(ios::beg); | |
string line; | |
vector<string> vrec; | |
while(1) { | |
table >> line; | |
if(table.eof()) | |
break; | |
vrec = record2vector(line); | |
if (vrec[index] == value) | |
line = record; | |
text.append(line+"\n"); | |
} | |
remove(tablename.c_str()); | |
reload(); | |
table << text; | |
table.flush(); | |
return 0; | |
} | |
int del(int index, string value) | |
{ | |
string text; | |
table.seekg(ios::beg); | |
string line; | |
vector<string> vrec; | |
while(1) { | |
table >> line; | |
if(table.eof()) | |
break; | |
vrec = record2vector(line); | |
if (vrec[index] != value) | |
text.append(line+"\n"); | |
} | |
remove(tablename.c_str()); | |
reload(); | |
table << text; | |
table.flush(); | |
return 0; | |
} | |
~Database() | |
{ | |
table.close(); | |
} | |
}; | |
/** Models **/ | |
enum { | |
/* sanses model */ | |
FSANS_ID = 0, | |
FSANS_CINEMA, | |
FSANS_FILM, | |
FSANS_DATE, | |
/* ticket model */ | |
FTICKET_ID = 0, | |
FTICKET_SANS_ID, | |
FTICKET_PRICE, | |
FTICKET_UESRNAME, | |
/* user model */ | |
FUSER_USERNAME = 0, | |
FUSER_PASSWORD, | |
}; | |
Database users, tickets, sanses; | |
void migrate() | |
{ | |
users.init("users"); | |
sanses.init("sanses"); | |
tickets.init("tickets"); | |
vector<string> vrecs; | |
vrecs = users.select(FUSER_USERNAME, "admin"); | |
if (vrecs.size() == 0) { | |
users.create("admin,admin"); | |
} | |
} | |
string loggedin; | |
void login() | |
{ | |
while (1) { | |
char opt; | |
string username, password; | |
vector<string> vrecs; | |
cout << "[1] Login" << endl | |
<< "[2] Register" << endl | |
<< "[e] Exit" << endl << endl | |
<< "Choose option: "; | |
cin >> opt; | |
switch (opt) | |
{ | |
case '1': | |
cout << "Enter username: "; | |
cin >> username; | |
cout << "Enter password: "; | |
cin >> password; | |
vrecs = users.select(FUSER_USERNAME, username); | |
vrecs = Database::record2vector(vrecs[0]); | |
if (username == vrecs[FUSER_USERNAME] && password == vrecs[FUSER_PASSWORD]) { | |
loggedin = username; | |
return; | |
} | |
cout << "Invalid username or password" << endl; | |
break; | |
case '2': | |
cout << "Enter username: "; | |
cin >> username; | |
cout << "Enter password: "; | |
cin >> password; | |
vrecs = users.select(FUSER_USERNAME, username); | |
if (vrecs.size() > 0) | |
cout << "username already exists" << endl; | |
else | |
users.create(username+","+password); | |
break; | |
case 'e': | |
cout << "Exit from program" << endl; | |
exit(0); | |
default: | |
break; | |
} | |
} | |
} | |
void _search_sanses_menu(string desc, string table) | |
{ | |
int index; | |
string record; | |
vector<string> vrecs; | |
cout << desc; | |
cin >> index; | |
if (index >= 0) { | |
cout << "Enter search value: "; | |
cin >> record; | |
} | |
cout << table << endl; | |
vrecs = sanses.select(index, record); | |
for (auto &&r : vrecs) { | |
cout << r << endl; | |
} | |
} | |
void manageCinema() | |
{ | |
cout << endl << endl << "Hello admin! You can manage your service" << endl << endl; | |
while (1) { | |
char opt; | |
int index; | |
string record, srchval; | |
vector<string> vrecs; | |
cout << "[1] Create sans" << endl | |
<< "[2] Search sans" << endl | |
<< "[3] Update sans" << endl | |
<< "[4] Delete sans" << endl | |
<< "[5] Create number of tickets" << endl | |
<< "[6] Search tickets" << endl | |
<< "[e] Exit" << endl << endl | |
<< "Choose option: "; | |
cin >> opt; | |
switch (opt) | |
{ | |
case '1': | |
cout << "Enter (Format: id,cinema,film,date): "; | |
cin >> record; | |
sanses.create(record); | |
break; | |
case '2': | |
_search_sanses_menu( | |
"Enter search index [id=0,cinema=1,film=2,date=3] (-1 for show all): ", | |
"id,cinema,film,date" | |
); | |
break; | |
case '3': | |
cout << "Enter search index [id=0,cinema=1,film=2,date=3]: "; | |
cin >> index; | |
cout << "Enter search value: "; | |
cin >> srchval; | |
cout << "Enter new data (Format: id,cinema,film,date): "; | |
cin >> record; | |
sanses.update(index, srchval, record); | |
break; | |
case '4': | |
cout << "Enter search index [id=0,cinema=1,film=2,date=3]: "; | |
cin >> index; | |
cout << "Enter search value: "; | |
cin >> srchval; | |
sanses.del(index, srchval); | |
break; | |
case '5': | |
cout << "Enter ticket data (Format: sans_id,price): "; | |
cin >> record; | |
cout << "Enter count of tickets: "; | |
cin >> index; | |
for (int i = 0; i < index; i++) | |
tickets.create(to_string(i) + "," + record + ","); | |
break; | |
case '6': | |
cout << "Enter search index [id=0,sans_id=1,price=2,username=3] (-1 for show all): "; | |
cin >> index; | |
if (index >= 0) { | |
cout << "Enter search value: "; | |
cin >> record; | |
} | |
cout << "id,sans_id,price,username" << endl; | |
vrecs = tickets.select(index, record); | |
for (auto &&r : vrecs) { | |
cout << r << endl; | |
} | |
break; | |
case 'e': | |
return; | |
default: | |
break; | |
} | |
} | |
} | |
void buyTicket() | |
{ | |
cout << endl << endl << "Hi dear user! Welcome to our service!" << endl << endl; | |
while (1) { | |
char opt; | |
int index; | |
string record, srchval; | |
vector<string> vrecs, vsub; | |
cout << "[1] Search sanses" << endl | |
<< "[2] Search available tickets" << endl | |
<< "[3] Search my tickets" << endl | |
<< "[4] buy ticket" << endl | |
<< "[e] Exit" << endl << endl | |
<< "Choose option: "; | |
cin >> opt; | |
switch (opt) | |
{ | |
case '1': | |
_search_sanses_menu( | |
"Enter search index [id=0,cinema=1,film=2,date=3] (-1 for show all): ", | |
"id,cinema,film,date" | |
); | |
break; | |
case '2': | |
cout << "Enter search index [id=0,sans_id=1,price=2,username=3] (-1 for show all): "; | |
cin >> index; | |
if (index >= 0) { | |
cout << "Enter search value: "; | |
cin >> record; | |
} | |
cout << "id,sans_id,price,username" << endl; | |
vrecs = tickets.select(index, record); | |
for (auto &&r : vrecs) { | |
vsub = Database::record2vector(r); | |
if (vsub[FTICKET_UESRNAME] == "") | |
cout << r << endl; | |
} | |
break; | |
case '3': | |
cout << "Enter search index [id=0,sans_id=1,price=2,username=3] (-1 for show all): "; | |
cin >> index; | |
if (index >= 0) { | |
cout << "Enter search value: "; | |
cin >> record; | |
} | |
cout << "id,sans_id,price,username" << endl; | |
vrecs = tickets.select(index, record); | |
for (auto &&r : vrecs) { | |
vsub = Database::record2vector(r); | |
if (vsub[FTICKET_UESRNAME] == loggedin) | |
cout << r << endl; | |
} | |
break; | |
case '4': | |
cout << "Enter ticket [id,sans_id,price]: "; | |
cin >> record; | |
vsub = Database::record2vector(record); | |
if (vsub.size() == 0) { | |
cout << "invalid ticket" << endl; | |
break; | |
} | |
tickets.update(FTICKET_ID, vsub[FTICKET_ID], record+","+loggedin); | |
break; | |
case 'e': | |
return; | |
default: | |
break; | |
} | |
} | |
} | |
int main() | |
{ | |
migrate(); | |
login(); | |
if (loggedin == "admin") { | |
manageCinema(); | |
} else { | |
buyTicket(); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment