Advertisement
Guest User

Untitled

a guest
Jul 10th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.05 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <pgtypes_date.h>
  5.  
  6. EXEC SQL INCLUDE sqlca;
  7.  
  8. int state = -1;
  9.  
  10. struct user
  11. {
  12.     int id;
  13.     char login[32];
  14.     char passwd[32];
  15.     int admin;
  16.     user(char* _login, char* _passwd, int _id)
  17.     {
  18.     id = _id;
  19.     strcpy(login, _login);
  20.     strcpy(passwd, _passwd);
  21.     if (strcmp("admin", login) == 0)
  22.     {
  23.         admin = 1;
  24.     }
  25.     else
  26.     {
  27.         admin = 0;
  28.     }
  29.     }
  30. };
  31.  
  32. user* u;
  33.  
  34. static void set_error_handler(void)
  35. {
  36.     EXEC SQL WHENEVER SQLERROR SQLPRINT;
  37. }  
  38.  
  39. static void connect()
  40. {
  41.     EXEC SQL CONNECT TO ikryukov@gagarine USER ikryukov IDENTIFIED BY krukovilya;
  42.     EXEC SQL SET AUTOCOMMIT TO ON;
  43. }
  44.  
  45. static void disconnect()
  46. {
  47.     EXEC SQL DISCONNECT ALL;
  48. }
  49. void printMenu()
  50. {
  51.     printf("Menu:\n");
  52.     printf("1) view user list\n");
  53.     printf("2) add new user (for admin only)\n");
  54.     printf("3) add new task (for admin only)\n");
  55.     printf("4) take test!\n");
  56.     printf("5) view statistic\n");
  57.     printf("0) exit\n");
  58.    
  59. }
  60. static user* login()
  61. {
  62.     EXEC SQL BEGIN DECLARE SECTION;
  63.     char login[80];
  64.     char passwd[80];
  65.     int id = -1;
  66.     EXEC SQL END DECLARE SECTION;    
  67.     printf("login: ");
  68.     scanf("%s", login);
  69.     printf("password: ");
  70.     scanf("%s", passwd);
  71.     EXEC SQL SELECT users.id INTO :id FROM users WHERE users.login = :login AND users.password = :passwd;
  72.     if (id == -1)
  73.     {
  74.     printf("Sorry, wrong login or password\n");
  75.     return NULL;   
  76.     } else
  77.     {
  78.     printf("id : %d\n", id);
  79.     printf("Hello, %s!\n", login); 
  80.     return new user(login, passwd, id);
  81.     }
  82. }
  83. static void addUser()
  84. {
  85.     if (u->admin == 0)
  86.     {
  87.     printf("You are not admin, sorry\n");
  88.     return;
  89.     }
  90.     EXEC SQL BEGIN DECLARE SECTION;
  91.     char login[80];
  92.     char passwd[80];
  93.     int uid = -1;
  94.     EXEC SQL END DECLARE SECTION;
  95.     bool finish = false;
  96.     while(!finish)
  97.     {
  98.         printf("Enter new user login: ");
  99.     scanf("%s", login);
  100.         printf("Enter new user password: ");
  101.         scanf("%s", passwd);
  102.         EXEC SQL SELECT users.id INTO :uid FROM users WHERE users.login = :login;
  103.         if (uid == -1) //user doesn't exist
  104.         {
  105.         finish = true;
  106.         } else
  107.         {
  108.             printf("User exist! Please, try again!\n");
  109.             uid = -1;
  110.         }
  111.     }
  112.     EXEC SQL INSERT INTO users (login, password) values (:login, :passwd);
  113.     printf("User added!\n");
  114.     state = -1;
  115. }
  116. void addTask()
  117. {
  118.     if (u->admin == 0)
  119.     {
  120.     printf("You are not admin, sorry\n");
  121.     return;
  122.     }
  123.     EXEC SQL BEGIN DECLARE SECTION;
  124.     char quest[1024];
  125.     int ans;
  126.     EXEC SQL END DECLARE SECTION;
  127.     printf("Enter new question: \n");
  128.     scanf("%s", quest);
  129.     printf("Enter correct answer: ");
  130.     scanf("%d", &ans);
  131.     EXEC SQL INSERT INTO task (question, answer) values (:quest, :ans);
  132.     printf("Task added!\n");
  133.     state = -1;
  134. }
  135. static void takeTest()
  136. {
  137.     int usr_ans;
  138.     EXEC SQL SET AUTOCOMMIT TO OFF;
  139.     EXEC SQL BEGIN DECLARE SECTION;
  140.     char quest[1024];
  141.     int ans;
  142.     int win = 0;
  143.     int fail = 0;
  144.     int userID = u->id;
  145.     EXEC SQL END DECLARE SECTION;
  146.     EXEC SQL DECLARE iter CURSOR FOR
  147.     SELECT question, answer from task;
  148.     EXEC SQL OPEN iter;
  149.     EXEC SQL WHENEVER NOT FOUND DO BREAK;
  150.     for (;;)
  151.     {
  152.     EXEC SQL FETCH NEXT FROM iter INTO
  153.     :quest, :ans;
  154.     printf("quest : %s\n", quest);
  155.     scanf("%d", &usr_ans);
  156.     if (ans == usr_ans)
  157.     {
  158.         ++win;
  159.     } else
  160.     {
  161.         ++fail;
  162.     }
  163.     }
  164.     EXEC SQL CLOSE iter;
  165.     EXEC SQL COMMIT;
  166.     EXEC SQL SET AUTOCOMMIT TO ON;
  167.     EXEC SQL WHENEVER NOT FOUND CONTINUE;
  168.     EXEC SQL INSERT INTO statistic (user_id, pass, fail) values (:userID, :win, :fail);
  169.     state = -1;
  170. }
  171. static void viewStatistic()
  172. {
  173.     EXEC SQL SET AUTOCOMMIT TO OFF;
  174.     EXEC SQL BEGIN DECLARE SECTION;
  175.     int userID = u->id;
  176.     date test_date;
  177.     int wins;
  178.     int fails;
  179.     EXEC SQL END DECLARE SECTION;
  180.     EXEC SQL DECLARE iter1 CURSOR FOR
  181.     SELECT dates, pass, fail FROM statistic WHERE user_id = :userID;
  182.     EXEC SQL OPEN iter1;
  183.     EXEC SQL WHENEVER NOT FOUND DO BREAK;
  184.     printf("Results for user: %s\n", u->login);
  185.     for (;;)
  186.     {
  187.     EXEC SQL FETCH NEXT FROM iter1 INTO
  188.     :test_date, :wins, :fails;
  189.     char* str_date = PGTYPESdate_to_asc(test_date);
  190.     printf("Date: %s, wins: %d, fails: %d\n", str_date, wins, fails);
  191.     }
  192.     EXEC SQL CLOSE iter1;
  193.     EXEC SQL COMMIT;
  194.     EXEC SQL SET AUTOCOMMIT TO ON;
  195.     EXEC SQL WHENEVER NOT FOUND CONTINUE;
  196.     state = -1;
  197. }
  198. int main()
  199. {
  200.     state = -1;
  201.     set_error_handler();
  202.     printf("start connection\n");
  203.     connect();
  204.     u = login();
  205.     if (u == NULL)
  206.     {
  207.     disconnect();
  208.     return 0;
  209.     }
  210.     while (state != 0)
  211.     {
  212.     switch (state)
  213.     {
  214.         case 1:
  215.         {
  216.         break;
  217.         }
  218.         case 2:
  219.         {
  220.         addUser();
  221.         break;
  222.         }
  223.         case 3:
  224.         {
  225.         addTask();
  226.         break;
  227.         }
  228.         case 4:
  229.         {
  230.         takeTest();
  231.         break;
  232.         }
  233.         case 5:
  234.         {
  235.         viewStatistic();
  236.         break;
  237.         }
  238.     }
  239.     printMenu();
  240.     scanf("%d", &state);
  241.     }
  242.     printf("end connection\n");
  243.     disconnect();
  244.     return 0;
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement