Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <pgtypes_date.h>
- EXEC SQL INCLUDE sqlca;
- int state = -1;
- struct user
- {
- int id;
- char login[32];
- char passwd[32];
- int admin;
- user(char* _login, char* _passwd, int _id)
- {
- id = _id;
- strcpy(login, _login);
- strcpy(passwd, _passwd);
- if (strcmp("admin", login) == 0)
- {
- admin = 1;
- }
- else
- {
- admin = 0;
- }
- }
- };
- user* u;
- static void set_error_handler(void)
- {
- EXEC SQL WHENEVER SQLERROR SQLPRINT;
- }
- static void connect()
- {
- EXEC SQL CONNECT TO ikryukov@gagarine USER ikryukov IDENTIFIED BY krukovilya;
- EXEC SQL SET AUTOCOMMIT TO ON;
- }
- static void disconnect()
- {
- EXEC SQL DISCONNECT ALL;
- }
- void printMenu()
- {
- printf("Menu:\n");
- printf("1) view user list\n");
- printf("2) add new user (for admin only)\n");
- printf("3) add new task (for admin only)\n");
- printf("4) take test!\n");
- printf("5) view statistic\n");
- printf("0) exit\n");
- }
- static user* login()
- {
- EXEC SQL BEGIN DECLARE SECTION;
- char login[80];
- char passwd[80];
- int id = -1;
- EXEC SQL END DECLARE SECTION;
- printf("login: ");
- scanf("%s", login);
- printf("password: ");
- scanf("%s", passwd);
- EXEC SQL SELECT users.id INTO :id FROM users WHERE users.login = :login AND users.password = :passwd;
- if (id == -1)
- {
- printf("Sorry, wrong login or password\n");
- return NULL;
- } else
- {
- printf("id : %d\n", id);
- printf("Hello, %s!\n", login);
- return new user(login, passwd, id);
- }
- }
- static void addUser()
- {
- if (u->admin == 0)
- {
- printf("You are not admin, sorry\n");
- return;
- }
- EXEC SQL BEGIN DECLARE SECTION;
- char login[80];
- char passwd[80];
- int uid = -1;
- EXEC SQL END DECLARE SECTION;
- bool finish = false;
- while(!finish)
- {
- printf("Enter new user login: ");
- scanf("%s", login);
- printf("Enter new user password: ");
- scanf("%s", passwd);
- EXEC SQL SELECT users.id INTO :uid FROM users WHERE users.login = :login;
- if (uid == -1) //user doesn't exist
- {
- finish = true;
- } else
- {
- printf("User exist! Please, try again!\n");
- uid = -1;
- }
- }
- EXEC SQL INSERT INTO users (login, password) values (:login, :passwd);
- printf("User added!\n");
- state = -1;
- }
- void addTask()
- {
- if (u->admin == 0)
- {
- printf("You are not admin, sorry\n");
- return;
- }
- EXEC SQL BEGIN DECLARE SECTION;
- char quest[1024];
- int ans;
- EXEC SQL END DECLARE SECTION;
- printf("Enter new question: \n");
- scanf("%s", quest);
- printf("Enter correct answer: ");
- scanf("%d", &ans);
- EXEC SQL INSERT INTO task (question, answer) values (:quest, :ans);
- printf("Task added!\n");
- state = -1;
- }
- static void takeTest()
- {
- int usr_ans;
- EXEC SQL SET AUTOCOMMIT TO OFF;
- EXEC SQL BEGIN DECLARE SECTION;
- char quest[1024];
- int ans;
- int win = 0;
- int fail = 0;
- int userID = u->id;
- EXEC SQL END DECLARE SECTION;
- EXEC SQL DECLARE iter CURSOR FOR
- SELECT question, answer from task;
- EXEC SQL OPEN iter;
- EXEC SQL WHENEVER NOT FOUND DO BREAK;
- for (;;)
- {
- EXEC SQL FETCH NEXT FROM iter INTO
- :quest, :ans;
- printf("quest : %s\n", quest);
- scanf("%d", &usr_ans);
- if (ans == usr_ans)
- {
- ++win;
- } else
- {
- ++fail;
- }
- }
- EXEC SQL CLOSE iter;
- EXEC SQL COMMIT;
- EXEC SQL SET AUTOCOMMIT TO ON;
- EXEC SQL WHENEVER NOT FOUND CONTINUE;
- EXEC SQL INSERT INTO statistic (user_id, pass, fail) values (:userID, :win, :fail);
- state = -1;
- }
- static void viewStatistic()
- {
- EXEC SQL SET AUTOCOMMIT TO OFF;
- EXEC SQL BEGIN DECLARE SECTION;
- int userID = u->id;
- date test_date;
- int wins;
- int fails;
- EXEC SQL END DECLARE SECTION;
- EXEC SQL DECLARE iter1 CURSOR FOR
- SELECT dates, pass, fail FROM statistic WHERE user_id = :userID;
- EXEC SQL OPEN iter1;
- EXEC SQL WHENEVER NOT FOUND DO BREAK;
- printf("Results for user: %s\n", u->login);
- for (;;)
- {
- EXEC SQL FETCH NEXT FROM iter1 INTO
- :test_date, :wins, :fails;
- char* str_date = PGTYPESdate_to_asc(test_date);
- printf("Date: %s, wins: %d, fails: %d\n", str_date, wins, fails);
- }
- EXEC SQL CLOSE iter1;
- EXEC SQL COMMIT;
- EXEC SQL SET AUTOCOMMIT TO ON;
- EXEC SQL WHENEVER NOT FOUND CONTINUE;
- state = -1;
- }
- int main()
- {
- state = -1;
- set_error_handler();
- printf("start connection\n");
- connect();
- u = login();
- if (u == NULL)
- {
- disconnect();
- return 0;
- }
- while (state != 0)
- {
- switch (state)
- {
- case 1:
- {
- break;
- }
- case 2:
- {
- addUser();
- break;
- }
- case 3:
- {
- addTask();
- break;
- }
- case 4:
- {
- takeTest();
- break;
- }
- case 5:
- {
- viewStatistic();
- break;
- }
- }
- printMenu();
- scanf("%d", &state);
- }
- printf("end connection\n");
- disconnect();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement