Skip to content

Instantly share code, notes, and snippets.

@alirezaarzehgar
Created April 3, 2024 00:13
Show Gist options
  • Save alirezaarzehgar/0a39b6643a6622712d34001f6dd7f08b to your computer and use it in GitHub Desktop.
Save alirezaarzehgar/0a39b6643a6622712d34001f6dd7f08b to your computer and use it in GitHub Desktop.
#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