1 /* 2 ** 2011 December 1 3 ** 4 ** The author disclaims copyright to this source code. In place of 5 ** a legal notice, here is a blessing: 6 ** 7 ** May you do good and not evil. 8 ** May you find forgiveness for yourself and forgive others. 9 ** May you share freely, never taking more than you give. 10 ** 11 ************************************************************************* 12 ** 13 ** This file contains the interface definition for the quota a VFS shim. 14 ** 15 ** This particular shim enforces a quota system on files. One or more 16 ** database files are in a "quota group" that is defined by a GLOB 17 ** pattern. A quota is set for the combined size of all files in the 18 ** the group. A quota of zero means "no limit". If the total size 19 ** of all files in the quota group is greater than the limit, then 20 ** write requests that attempt to enlarge a file fail with SQLITE_FULL. 21 ** 22 ** However, before returning SQLITE_FULL, the write requests invoke 23 ** a callback function that is configurable for each quota group. 24 ** This callback has the opportunity to enlarge the quota. If the 25 ** callback does enlarge the quota such that the total size of all 26 ** files within the group is less than the new quota, then the write 27 ** continues as if nothing had happened. 28 */ 29 #ifndef _QUOTA_H_ 30 #include "sqlite3.h" 31 #include <stdio.h> 32 #include <sys/types.h> 33 #include <sys/stat.h> 34 35 /* Make this callable from C++ */ 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 /* 41 ** Initialize the quota VFS shim. Use the VFS named zOrigVfsName 42 ** as the VFS that does the actual work. Use the default if 43 ** zOrigVfsName==NULL. 44 ** 45 ** The quota VFS shim is named "quota". It will become the default 46 ** VFS if makeDefault is non-zero. 47 ** 48 ** THIS ROUTINE IS NOT THREADSAFE. Call this routine exactly once 49 ** during start-up. 50 */ 51 int sqlite3_quota_initialize(const char *zOrigVfsName, int makeDefault); 52 53 /* 54 ** Shutdown the quota system. 55 ** 56 ** All SQLite database connections must be closed before calling this 57 ** routine. 58 ** 59 ** THIS ROUTINE IS NOT THREADSAFE. Call this routine exactly once while 60 ** shutting down in order to free all remaining quota groups. 61 */ 62 int sqlite3_quota_shutdown(void); 63 64 /* 65 ** Create or destroy a quota group. 66 ** 67 ** The quota group is defined by the zPattern. When calling this routine 68 ** with a zPattern for a quota group that already exists, this routine 69 ** merely updates the iLimit, xCallback, and pArg values for that quota 70 ** group. If zPattern is new, then a new quota group is created. 71 ** 72 ** The zPattern is always compared against the full pathname of the file. 73 ** Even if APIs are called with relative pathnames, SQLite converts the 74 ** name to a full pathname before comparing it against zPattern. zPattern 75 ** is a glob pattern with the following matching rules: 76 ** 77 ** '*' Matches any sequence of zero or more characters. 78 ** 79 ** '?' Matches exactly one character. 80 ** 81 ** [...] Matches one character from the enclosed list of 82 ** characters. "]" can be part of the list if it is 83 ** the first character. Within the list "X-Y" matches 84 ** characters X or Y or any character in between the 85 ** two. Ex: "[0-9]" matches any digit. 86 ** 87 ** [^...] Matches one character not in the enclosed list. 88 ** 89 ** / Matches either / or \. This allows glob patterns 90 ** containing / to work on both unix and windows. 91 ** 92 ** Note that, unlike unix shell globbing, the directory separator "/" 93 ** can match a wildcard. So, for example, the pattern "/abc/xyz/" "*" 94 ** matches any files anywhere in the directory hierarchy beneath 95 ** /abc/xyz. 96 ** 97 ** The glob algorithm works on bytes. Multi-byte UTF8 characters are 98 ** matched as if each byte were a separate character. 99 ** 100 ** If the iLimit for a quota group is set to zero, then the quota group 101 ** is disabled and will be deleted when the last database connection using 102 ** the quota group is closed. 103 ** 104 ** Calling this routine on a zPattern that does not exist and with a 105 ** zero iLimit is a no-op. 106 ** 107 ** A quota group must exist with a non-zero iLimit prior to opening 108 ** database connections if those connections are to participate in the 109 ** quota group. Creating a quota group does not affect database connections 110 ** that are already open. 111 ** 112 ** The patterns that define the various quota groups should be distinct. 113 ** If the same filename matches more than one quota group pattern, then 114 ** the behavior of this package is undefined. 115 */ 116 int sqlite3_quota_set( 117 const char *zPattern, /* The filename pattern */ 118 sqlite3_int64 iLimit, /* New quota to set for this quota group */ 119 void (*xCallback)( /* Callback invoked when going over quota */ 120 const char *zFilename, /* Name of file whose size increases */ 121 sqlite3_int64 *piLimit, /* IN/OUT: The current limit */ 122 sqlite3_int64 iSize, /* Total size of all files in the group */ 123 void *pArg /* Client data */ 124 ), 125 void *pArg, /* client data passed thru to callback */ 126 void (*xDestroy)(void*) /* Optional destructor for pArg */ 127 ); 128 129 /* 130 ** Bring the named file under quota management, assuming its name matches 131 ** the glob pattern of some quota group. Or if it is already under 132 ** management, update its size. If zFilename does not match the glob 133 ** pattern of any quota group, this routine is a no-op. 134 */ 135 int sqlite3_quota_file(const char *zFilename); 136 137 /* 138 ** The following object serves the same role as FILE in the standard C 139 ** library. It represents an open connection to a file on disk for I/O. 140 ** 141 ** A single quota_FILE should not be used by two or more threads at the 142 ** same time. Multiple threads can be using different quota_FILE objects 143 ** simultaneously, but not the same quota_FILE object. 144 */ 145 typedef struct quota_FILE quota_FILE; 146 147 /* 148 ** Create a new quota_FILE object used to read and/or write to the 149 ** file zFilename. The zMode parameter is as with standard library zMode. 150 */ 151 quota_FILE *sqlite3_quota_fopen(const char *zFilename, const char *zMode); 152 153 /* 154 ** Perform I/O against a quota_FILE object. When doing writes, the 155 ** quota mechanism may result in a short write, in order to prevent 156 ** the sum of sizes of all files from going over quota. 157 */ 158 size_t sqlite3_quota_fread(void*, size_t, size_t, quota_FILE*); 159 size_t sqlite3_quota_fwrite(const void*, size_t, size_t, quota_FILE*); 160 161 /* 162 ** Flush all written content held in memory buffers out to disk. 163 ** This is the equivalent of fflush() in the standard library. 164 ** 165 ** If the hardSync parameter is true (non-zero) then this routine 166 ** also forces OS buffers to disk - the equivalent of fsync(). 167 ** 168 ** This routine return zero on success and non-zero if something goes 169 ** wrong. 170 */ 171 int sqlite3_quota_fflush(quota_FILE*, int hardSync); 172 173 /* 174 ** Close a quota_FILE object and free all associated resources. The 175 ** file remains under quota management. 176 */ 177 int sqlite3_quota_fclose(quota_FILE*); 178 179 /* 180 ** Move the read/write pointer for a quota_FILE object. Or tell the 181 ** current location of the read/write pointer. 182 */ 183 int sqlite3_quota_fseek(quota_FILE*, long, int); 184 void sqlite3_quota_rewind(quota_FILE*); 185 long sqlite3_quota_ftell(quota_FILE*); 186 187 /* 188 ** Test the error indicator for the given file. 189 ** 190 ** Return non-zero if the error indicator is set. 191 */ 192 int sqlite3_quota_ferror(quota_FILE*); 193 194 /* 195 ** Truncate a file previously opened by sqlite3_quota_fopen(). Return 196 ** zero on success and non-zero on any kind of failure. 197 ** 198 ** The newSize argument must be less than or equal to the current file size. 199 ** Any attempt to "truncate" a file to a larger size results in 200 ** undefined behavior. 201 */ 202 int sqlite3_quota_ftruncate(quota_FILE*, sqlite3_int64 newSize); 203 204 /* 205 ** Return the last modification time of the opened file, in seconds 206 ** since 1970. 207 */ 208 int sqlite3_quota_file_mtime(quota_FILE*, time_t *pTime); 209 210 /* 211 ** Return the size of the file as it is known to the quota system. 212 ** 213 ** This size might be different from the true size of the file on 214 ** disk if some outside process has modified the file without using the 215 ** quota mechanism, or if calls to sqlite3_quota_fwrite() have occurred 216 ** which have increased the file size, but those writes have not yet been 217 ** forced to disk using sqlite3_quota_fflush(). 218 ** 219 ** Return -1 if the file is not participating in quota management. 220 */ 221 sqlite3_int64 sqlite3_quota_file_size(quota_FILE*); 222 223 /* 224 ** Return the true size of the file. 225 ** 226 ** The true size should be the same as the size of the file as known 227 ** to the quota system, however the sizes might be different if the 228 ** file has been extended or truncated via some outside process or if 229 ** pending writes have not yet been flushed to disk. 230 ** 231 ** Return -1 if the file does not exist or if the size of the file 232 ** cannot be determined for some reason. 233 */ 234 sqlite3_int64 sqlite3_quota_file_truesize(quota_FILE*); 235 236 /* 237 ** Determine the amount of data in bytes available for reading 238 ** in the given file. 239 ** 240 ** Return -1 if the amount cannot be determined for some reason. 241 */ 242 long sqlite3_quota_file_available(quota_FILE*); 243 244 /* 245 ** Delete a file from the disk, if that file is under quota management. 246 ** Adjust quotas accordingly. 247 ** 248 ** If zFilename is the name of a directory that matches one of the 249 ** quota glob patterns, then all files under quota management that 250 ** are contained within that directory are deleted. 251 ** 252 ** A standard SQLite result code is returned (SQLITE_OK, SQLITE_NOMEM, etc.) 253 ** When deleting a directory of files, if the deletion of any one 254 ** file fails (for example due to an I/O error), then this routine 255 ** returns immediately, with the error code, and does not try to 256 ** delete any of the other files in the specified directory. 257 ** 258 ** All files are removed from quota management and deleted from disk. 259 ** However, no attempt is made to remove empty directories. 260 ** 261 ** This routine is a no-op for files that are not under quota management. 262 */ 263 int sqlite3_quota_remove(const char *zFilename); 264 265 #ifdef __cplusplus 266 } /* end of the 'extern "C"' block */ 267 #endif 268 #endif /* _QUOTA_H_ */ 269