Fixing basic cokebank to actually work
[tpg/opendispense2.git] / src / cokebank_basic / bank.c
1 /*
2  * OpenDispense 2
3  * UCC (University [of WA] Computer Club) Electronic Accounting System
4  * - Cokebank (Basic Version)
5  *
6  * bank.c - Actual bank database
7  *
8  * This file is licenced under the 3-clause BSD Licence. See the file COPYING
9  * for full details.
10  */
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <limits.h>
14 #include "common.h"
15
16 enum {
17         FLAG_TYPEMASK    = 0x03,
18         USER_TYPE_NORMAL = 0x00,
19         USER_TYPE_COKE   = 0x01,
20         USER_TYPE_WHEEL  = 0x02,
21         USER_TYPE_GOD    = 0x03
22 };
23
24 // === GLOBALS ===
25 tUser   *gaBank_Users;
26  int    giBank_NumUsers;
27 FILE    *gBank_File;
28
29 // === CODE ===
30 int Bank_GetUserByUnixID(int UnixID)
31 {
32          int    i;
33         // Expensive search :(
34         for( i = 0; i < giBank_NumUsers; i ++ )
35         {
36                 if( gaBank_Users[i].UnixID == UnixID )
37                         return i;
38         }
39
40         return -1;
41 }
42
43 int Bank_GetUserBalance(int ID)
44 {
45         if( ID < 0 || ID >= giBank_NumUsers )
46                 return INT_MIN;
47
48         return gaBank_Users[ID].Balance;
49 }
50
51 int Bank_AlterUserBalance(int ID, int Delta)
52 {
53         // Sanity
54         if( ID < 0 || ID >= giBank_NumUsers )
55                 return -1;
56
57         // Update
58         gaBank_Users[ID].Balance += Delta;
59
60         // Commit
61         fseek(gBank_File, ID*sizeof(gaBank_Users[0]), SEEK_SET);
62         fwrite(&gaBank_Users[ID], sizeof(gaBank_Users[0]), 1, gBank_File);
63         
64         return 0;
65 }
66
67 int Bank_SetUserBalance(int ID, int Value)
68 {
69         // Sanity
70         if( ID < 0 || ID >= giBank_NumUsers )
71                 return -1;
72
73         // Update
74         gaBank_Users[ID].Balance = Value;
75         
76         // Commit
77         fseek(gBank_File, ID*sizeof(gaBank_Users[0]), SEEK_SET);
78         fwrite(&gaBank_Users[ID], sizeof(gaBank_Users[0]), 1, gBank_File);
79         
80         return 0;
81 }
82
83 int Bank_GetMinAllowedBalance(int ID)
84 {
85         if( ID < 0 || ID >= giBank_NumUsers )
86                 return -1;
87
88         switch( gaBank_Users[ID].Flags & FLAG_TYPEMASK )
89         {
90         case USER_TYPE_NORMAL:  return     0;
91         case USER_TYPE_COKE:    return  -2000;
92         case USER_TYPE_WHEEL:   return -10000;
93         case USER_TYPE_GOD:     return INT_MIN;
94         default:        return 0;
95         }
96 }
97
98 int Bank_GetUserUnixID(int ID)
99 {
100         if( ID < 0 || ID >= giBank_NumUsers )
101                 return -1;
102
103         return gaBank_Users[ID].UnixID;
104 }
105
106 /**
107  * \brief Create a new user in our database
108  */
109 int Bank_AddUser(int UnixID)
110 {
111         void    *tmp;
112
113         // Can has moar space plz?
114         tmp = realloc(gaBank_Users, (giBank_NumUsers+1)*sizeof(gaBank_Users[0]));
115         if( !tmp )      return -1;
116         gaBank_Users = tmp;
117
118         // Crete new user
119         gaBank_Users[giBank_NumUsers].UnixID = UnixID;
120         gaBank_Users[giBank_NumUsers].Balance = 0;
121         gaBank_Users[giBank_NumUsers].Flags = 0;
122         
123         // Commit to file
124         fseek(gBank_File, giBank_NumUsers*sizeof(gaBank_Users[0]), SEEK_SET);
125         fwrite(&gaBank_Users[giBank_NumUsers], sizeof(gaBank_Users[0]), 1, gBank_File);
126
127         // Increment count
128         giBank_NumUsers ++;
129
130         return 0;
131 }

UCC git Repository :: git.ucc.asn.au