AMXX-BG.INFO nvault_util.inc Raw include

nvault_util.inc

Original include source with line numbers.

Back Download .inc
1
2 /*
3 nVault Utility
4 v0.3
5 by bugsy
6 */
7
8 #if defined _nvault_util_included
9 #endinput
10 #endif
11 #define _nvault_util_included
12
13 #if !defined _nvault_included
14 #include <nvault>
15 #endif
16
17 #if !defined _amxmisc_included
18 #include <amxmisc>
19 #endif
20
21 #define _NVAULTUTIL_MAX_KEY_LEN 255
22 #define _NVAULTUTIL_MAX_VAL_LEN 512
23 #define _NVAULTUTIL_BUFFER_SIZE 128
24
25 #define _NVAULTUTIL_OFFSET_ENTRYCOUNT 6
26 #define _NVAULTUTIL_OFFSET_DATASTART 10
27
28 #define _nvault_util_minsize(%1,%2) ((%1<%2)?%1:%2)
29
30 //********************************************************************************************
31 // Increase this value if your plugin throws the below error:
32 // "Array size too large, you must increase NVAULTUTIL_MAXARRAYSIZE in nvault_util.inc"
33
34 const _NVAULTUTIL_MAXARRAYSIZE = 500;
35 //********************************************************************************************
36
37 const _NVAULTUTIL_BUFFERSIZE = ( ( _NVAULTUTIL_MAXARRAYSIZE * 5 ) + 1);
38 const _NVAULTUTIL_BYTEMAP = 0b11110000;
39 const _NVAULTUTIL_NULLBYTE = 0b10101010;
40
41 stock nvault_util_open( const szVault[] )
42 {
43 new szFile[ 64 ];
44
45 formatex( szFile[ get_datadir( szFile , charsmax( szFile ) ) ] , charsmax( szFile ) , "/vault/%s.vault" , szVault );
46
47 return fopen( szFile , "rb" );
48 }
49
50 stock nvault_util_close( iVaultHandle )
51 {
52 fclose( iVaultHandle );
53 }
54
55 stock nvault_util_count( iVaultHandle )
56 {
57 new DataBuffer[ 1 ];
58
59 fseek( iVaultHandle , _NVAULTUTIL_OFFSET_ENTRYCOUNT , SEEK_SET );
60 fread_raw( iVaultHandle , DataBuffer , 1 , BLOCK_INT );
61
62 return DataBuffer[ 0 ];
63 }
64
65 stock nvault_util_read( iVaultHandle , iOffset , szKey[] , iKeySize , szVal[] , iValSize , &iTimeStamp=0 )
66 {
67 static iKeyLen , iValLen , DataBuffer[ _NVAULTUTIL_BUFFER_SIZE ];
68
69 fseek( iVaultHandle , iOffset ? iOffset : _NVAULTUTIL_OFFSET_DATASTART , SEEK_SET );
70
71 fread_raw( iVaultHandle , DataBuffer , 1 , BLOCK_INT );
72 iTimeStamp = DataBuffer[ 0 ];
73
74 fread_raw( iVaultHandle , DataBuffer , 1 , BLOCK_BYTE );
75 iKeyLen = DataBuffer[ 0 ] & 0xFF;
76
77 fread_raw( iVaultHandle , DataBuffer , 1 , BLOCK_SHORT );
78 iValLen = DataBuffer[ 0 ] & 0xFFFF;
79
80 fread_raw( iVaultHandle , DataBuffer , iKeyLen , BLOCK_CHAR );
81 _nvault_util_read_string( szKey , _nvault_util_minsize( iKeySize , iKeyLen ) , DataBuffer , sizeof( DataBuffer ) );
82
83 fread_raw( iVaultHandle , DataBuffer , iValLen , BLOCK_CHAR );
84 _nvault_util_read_string( szVal , _nvault_util_minsize( iValSize , iValLen ) , DataBuffer , sizeof( DataBuffer ) );
85
86 return ftell( iVaultHandle );
87 }
88
89 stock nvault_util_readall( iVaultHandle , const szForwardFunc[] , Data[] = {0} , iSize=0 )
90 {
91 new iFwdHandle = CreateMultiForward( szForwardFunc , ET_IGNORE , FP_CELL , FP_CELL , FP_STRING , FP_STRING , FP_CELL , FP_STRING , FP_CELL );
92
93 if ( iFwdHandle <= 0 )
94 set_fail_state( "nvault_util_readall() failed to create forward" );
95
96 new iRet , iPos , iNumEntries = nvault_util_count( iVaultHandle );
97 new szKey[ _NVAULTUTIL_MAX_KEY_LEN ] , szValue[ _NVAULTUTIL_MAX_VAL_LEN ] , iTimeStamp;
98
99 for ( new iCurrent = 1 ; iCurrent <= iNumEntries ; iCurrent++ )
100 {
101 iPos = nvault_util_read( iVaultHandle , iPos , szKey , charsmax( szKey ) , szValue , charsmax( szValue ) , iTimeStamp );
102
103 ExecuteForward( iFwdHandle , iRet , iCurrent , iNumEntries , szKey , szValue , iTimeStamp , Data , iSize );
104 }
105
106 return iRet;
107 }
108
109 stock nvault_util_pos( iVaultHandle )
110 {
111 return ftell( iVaultHandle );
112 }
113
114 stock nvault_set_array( vault , const key[] , const any:array[] , size )
115 {
116 new iArrayPos , iOutputPos , iValue[ 1 ] , szString[ _NVAULTUTIL_BUFFERSIZE ];
117
118 if ( size > _NVAULTUTIL_MAXARRAYSIZE )
119 set_fail_state( "[nVault Utility] Array size too large, you must increase NVAULTUTIL_MAXARRAYSIZE in nvault_util.inc." );
120
121 while ( ( iArrayPos < size ) && ( iOutputPos < charsmax( szString ) ) )
122 {
123 iValue[ 0 ] = array[ iArrayPos++ ];
124
125 if ( !( cellmin <= iValue[ 0 ] <= cellmax ) )
126 set_fail_state( "[nVault Utility] Value exceeds valid long value range." );
127
128 szString[ iOutputPos++ ] = _nvault_util_byte_map( iValue );
129
130 for ( new i = 0 ; i < 4 ; i++ )
131 szString[ iOutputPos++ ] = !iValue{ i } ? _NVAULTUTIL_NULLBYTE : iValue{ i };
132 }
133
134 szString[ iOutputPos ] = EOS;
135
136 return nvault_set( vault , key , szString );
137 }
138
139 stock nvault_get_array( vault , const key[] , any:array[] , size , &timestamp=0 )
140 {
141 new iStringPos , iArrayPos , iValue[ 1 ] , bmByteMap , szString[ _NVAULTUTIL_BUFFERSIZE ];
142
143 if ( size > _NVAULTUTIL_MAXARRAYSIZE )
144 set_fail_state( "[nVault Utility] Array size too large, you must increase NVAULTUTIL_MAXARRAYSIZE in nvault_util.inc." );
145
146 //nvault_get( vault , key , szString , charsmax( szString ) );
147 nvault_lookup( vault , key , szString , charsmax( szString ) , timestamp );
148
149 while ( szString[ iStringPos ] && ( iStringPos < charsmax( szString ) ) && ( iArrayPos < size ) )
150 {
151 bmByteMap = szString[ iStringPos++ ];
152
153 for ( new i = 0 ; i < 4 ; i++ )
154 {
155 iValue{ i } = bmByteMap & ( 1 << i ) ? szString[ iStringPos ] : 0;
156 iStringPos++;
157 }
158
159 array[ iArrayPos++ ] = iValue[ 0 ];
160 }
161
162 return iArrayPos;
163 }
164
165 stock nvault_util_read_array( iVaultHandle , iOffset , szKey[] , iKeySize , iArray[] , iArraySize , &iItemsRead=0 , &iTimeStamp=0 )
166 {
167 static iKeyLen , iValLen , DataBuffer[ _NVAULTUTIL_BUFFER_SIZE ];
168 new iStringPos , iArrayPos , iValue[ 1 ] , bmByteMap , szString[ _NVAULTUTIL_BUFFERSIZE ];
169
170 fseek( iVaultHandle , iOffset ? iOffset : _NVAULTUTIL_OFFSET_DATASTART , SEEK_SET );
171
172 fread_raw( iVaultHandle , DataBuffer , 1 , BLOCK_INT );
173 iTimeStamp = DataBuffer[ 0 ];
174
175 fread_raw( iVaultHandle , DataBuffer , 1 , BLOCK_BYTE );
176 iKeyLen = DataBuffer[ 0 ] & 0xFF;
177
178 fread_raw( iVaultHandle , DataBuffer , 1 , BLOCK_SHORT );
179 iValLen = DataBuffer[ 0 ] & 0xFFFF;
180
181 fread_raw( iVaultHandle , DataBuffer , iKeyLen , BLOCK_CHAR );
182 _nvault_util_read_string( szKey , _nvault_util_minsize( iKeySize , iKeyLen ) , DataBuffer , sizeof( DataBuffer ) );
183
184 fread_raw( iVaultHandle , DataBuffer , iValLen , BLOCK_CHAR );
185 _nvault_util_read_string( szString , _nvault_util_minsize( charsmax( szString ) , iValLen ) , DataBuffer , sizeof( DataBuffer ) );
186
187 while ( szString[ iStringPos ] && ( iStringPos < charsmax( szString ) ) && ( iArrayPos < iArraySize ) )
188 {
189 bmByteMap = szString[ iStringPos++ ];
190
191 for ( new i = 0 ; i < 4 ; i++ )
192 {
193 iValue{ i } = bmByteMap & ( 1 << i ) ? szString[ iStringPos ] : 0;
194 iStringPos++;
195 }
196
197 iArray[ iArrayPos++ ] = iValue[ 0 ];
198 }
199
200 iItemsRead = iArrayPos;
201
202 return ftell( iVaultHandle );
203 }
204
205 stock nvault_util_readall_array( iVaultHandle , const szForwardFunc[] , Data[]={0} , iSize=0 )
206 {
207 new iFwdHandle = CreateMultiForward( szForwardFunc , ET_IGNORE , FP_CELL , FP_CELL , FP_STRING , FP_ARRAY , FP_CELL , FP_CELL , FP_STRING , FP_CELL );
208
209 if ( iFwdHandle <= 0 )
210 set_fail_state( "nvault_util_readall() failed to create forward" );
211
212 new iRet , iPos , iNumEntries = nvault_util_count( iVaultHandle );
213 new szKey[ _NVAULTUTIL_MAX_KEY_LEN ] , iArray[ _NVAULTUTIL_MAXARRAYSIZE ] , iTimeStamp , iArrayHandle , iItemsRead;
214
215 for ( new iCurrent = 1 ; iCurrent <= iNumEntries ; iCurrent++ )
216 {
217 iPos = nvault_util_read_array( iVaultHandle , iPos , szKey , charsmax( szKey ) , iArray , sizeof( iArray ) , iItemsRead , iTimeStamp );
218
219 iArrayHandle = PrepareArray( iArray , _NVAULTUTIL_MAXARRAYSIZE , 0 );
220 ExecuteForward( iFwdHandle , iRet , iCurrent , iNumEntries , szKey , iArrayHandle , iItemsRead , iTimeStamp , Data , iSize );
221 }
222
223 return iRet;
224 }
225
226 stock _nvault_util_byte_map( iValue[ 1 ] )
227 {
228 new iOut[ 1 ] = { _NVAULTUTIL_BYTEMAP };
229
230 for ( new i = 0 ; i < 4 ; i++)
231 iOut[ 0 ] |= !iValue{ i } ? 0 : ( 1 << i );
232
233 return iOut[ 0 ];
234 }
235
236 stock _nvault_util_read_string( szDestString[] , iMaxLen , const SourceData[] , iSourceSize )
237 {
238 new iDestPos = -1;
239 new iBytePos = 4;
240 new iOffset = 1;
241 new iSourceMax = ( iSourceSize * 4 );
242
243 while ( ( ++iDestPos < iMaxLen ) && ( iBytePos < iSourceMax ) )
244 {
245 szDestString[ iDestPos ] = SourceData{ iBytePos - iOffset++ };
246
247 if ( iDestPos && ( ( iDestPos % 4 ) == 3 ) )
248 {
249 iBytePos += 4;
250 iOffset = 1;
251 }
252 }
253
254 szDestString[ iDestPos ] = EOS;
255 }
256 /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
257 *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
258 */
259