Annotation of embedaddon/sqlite3/src/test_quota.h, revision 1.1

1.1     ! misho       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: 
        !            33: /* Make this callable from C++ */
        !            34: #ifdef __cplusplus
        !            35: extern "C" {
        !            36: #endif
        !            37: 
        !            38: /*
        !            39: ** Initialize the quota VFS shim.  Use the VFS named zOrigVfsName
        !            40: ** as the VFS that does the actual work.  Use the default if
        !            41: ** zOrigVfsName==NULL.  
        !            42: **
        !            43: ** The quota VFS shim is named "quota".  It will become the default
        !            44: ** VFS if makeDefault is non-zero.
        !            45: **
        !            46: ** THIS ROUTINE IS NOT THREADSAFE.  Call this routine exactly once
        !            47: ** during start-up.
        !            48: */
        !            49: int sqlite3_quota_initialize(const char *zOrigVfsName, int makeDefault);
        !            50: 
        !            51: /*
        !            52: ** Shutdown the quota system.
        !            53: **
        !            54: ** All SQLite database connections must be closed before calling this
        !            55: ** routine.
        !            56: **
        !            57: ** THIS ROUTINE IS NOT THREADSAFE.  Call this routine exactly once while
        !            58: ** shutting down in order to free all remaining quota groups.
        !            59: */
        !            60: int sqlite3_quota_shutdown(void);
        !            61: 
        !            62: /*
        !            63: ** Create or destroy a quota group.
        !            64: **
        !            65: ** The quota group is defined by the zPattern.  When calling this routine
        !            66: ** with a zPattern for a quota group that already exists, this routine
        !            67: ** merely updates the iLimit, xCallback, and pArg values for that quota
        !            68: ** group.  If zPattern is new, then a new quota group is created.
        !            69: **
        !            70: ** The zPattern is always compared against the full pathname of the file.
        !            71: ** Even if APIs are called with relative pathnames, SQLite converts the
        !            72: ** name to a full pathname before comparing it against zPattern.  zPattern
        !            73: ** is a glob pattern with the following matching rules:
        !            74: **
        !            75: **      '*'       Matches any sequence of zero or more characters.
        !            76: **
        !            77: **      '?'       Matches exactly one character.
        !            78: **
        !            79: **     [...]      Matches one character from the enclosed list of
        !            80: **                characters.  "]" can be part of the list if it is
        !            81: **                the first character.  Within the list "X-Y" matches
        !            82: **                characters X or Y or any character in between the
        !            83: **                two.  Ex:  "[0-9]" matches any digit.
        !            84: **
        !            85: **     [^...]     Matches one character not in the enclosed list.
        !            86: **
        !            87: **     /          Matches either / or \.  This allows glob patterns
        !            88: **                containing / to work on both unix and windows.
        !            89: **
        !            90: ** Note that, unlike unix shell globbing, the directory separator "/"
        !            91: ** can match a wildcard.  So, for example, the pattern "/abc/xyz/" "*"
        !            92: ** matches any files anywhere in the directory hierarchy beneath
        !            93: ** /abc/xyz.
        !            94: **
        !            95: ** The glob algorithm works on bytes.  Multi-byte UTF8 characters are
        !            96: ** matched as if each byte were a separate character.
        !            97: **
        !            98: ** If the iLimit for a quota group is set to zero, then the quota group
        !            99: ** is disabled and will be deleted when the last database connection using
        !           100: ** the quota group is closed.
        !           101: **
        !           102: ** Calling this routine on a zPattern that does not exist and with a
        !           103: ** zero iLimit is a no-op.
        !           104: **
        !           105: ** A quota group must exist with a non-zero iLimit prior to opening
        !           106: ** database connections if those connections are to participate in the
        !           107: ** quota group.  Creating a quota group does not affect database connections
        !           108: ** that are already open.
        !           109: **
        !           110: ** The patterns that define the various quota groups should be distinct.
        !           111: ** If the same filename matches more than one quota group pattern, then
        !           112: ** the behavior of this package is undefined.
        !           113: */
        !           114: int sqlite3_quota_set(
        !           115:   const char *zPattern,           /* The filename pattern */
        !           116:   sqlite3_int64 iLimit,           /* New quota to set for this quota group */
        !           117:   void (*xCallback)(              /* Callback invoked when going over quota */
        !           118:      const char *zFilename,         /* Name of file whose size increases */
        !           119:      sqlite3_int64 *piLimit,        /* IN/OUT: The current limit */
        !           120:      sqlite3_int64 iSize,           /* Total size of all files in the group */
        !           121:      void *pArg                     /* Client data */
        !           122:   ),
        !           123:   void *pArg,                     /* client data passed thru to callback */
        !           124:   void (*xDestroy)(void*)         /* Optional destructor for pArg */
        !           125: );
        !           126: 
        !           127: /*
        !           128: ** Bring the named file under quota management, assuming its name matches
        !           129: ** the glob pattern of some quota group.  Or if it is already under
        !           130: ** management, update its size.  If zFilename does not match the glob
        !           131: ** pattern of any quota group, this routine is a no-op.
        !           132: */
        !           133: int sqlite3_quota_file(const char *zFilename);
        !           134: 
        !           135: /*
        !           136: ** The following object serves the same role as FILE in the standard C
        !           137: ** library.  It represents an open connection to a file on disk for I/O.
        !           138: **
        !           139: ** A single quota_FILE should not be used by two or more threads at the
        !           140: ** same time.  Multiple threads can be using different quota_FILE objects
        !           141: ** simultaneously, but not the same quota_FILE object.
        !           142: */
        !           143: typedef struct quota_FILE quota_FILE;
        !           144: 
        !           145: /*
        !           146: ** Create a new quota_FILE object used to read and/or write to the
        !           147: ** file zFilename.  The zMode parameter is as with standard library zMode.
        !           148: */
        !           149: quota_FILE *sqlite3_quota_fopen(const char *zFilename, const char *zMode);
        !           150: 
        !           151: /*
        !           152: ** Perform I/O against a quota_FILE object.  When doing writes, the
        !           153: ** quota mechanism may result in a short write, in order to prevent
        !           154: ** the sum of sizes of all files from going over quota.
        !           155: */
        !           156: size_t sqlite3_quota_fread(void*, size_t, size_t, quota_FILE*);
        !           157: size_t sqlite3_quota_fwrite(void*, size_t, size_t, quota_FILE*);
        !           158: 
        !           159: /*
        !           160: ** Flush all written content held in memory buffers out to disk.
        !           161: ** This is the equivalent of fflush() in the standard library.
        !           162: **
        !           163: ** If the hardSync parameter is true (non-zero) then this routine
        !           164: ** also forces OS buffers to disk - the equivalent of fsync().
        !           165: **
        !           166: ** This routine return zero on success and non-zero if something goes
        !           167: ** wrong.
        !           168: */
        !           169: int sqlite3_quota_fflush(quota_FILE*, int hardSync);
        !           170: 
        !           171: /*
        !           172: ** Close a quota_FILE object and free all associated resources.  The
        !           173: ** file remains under quota management.
        !           174: */
        !           175: int sqlite3_quota_fclose(quota_FILE*);
        !           176: 
        !           177: /*
        !           178: ** Move the read/write pointer for a quota_FILE object.  Or tell the
        !           179: ** current location of the read/write pointer.
        !           180: */
        !           181: int sqlite3_quota_fseek(quota_FILE*, long, int);
        !           182: void sqlite3_quota_rewind(quota_FILE*);
        !           183: long sqlite3_quota_ftell(quota_FILE*);
        !           184: 
        !           185: /*
        !           186: ** Delete a file from the disk, if that file is under quota management.
        !           187: ** Adjust quotas accordingly.
        !           188: **
        !           189: ** If zFilename is the name of a directory that matches one of the
        !           190: ** quota glob patterns, then all files under quota management that
        !           191: ** are contained within that directory are deleted.
        !           192: **
        !           193: ** A standard SQLite result code is returned (SQLITE_OK, SQLITE_NOMEM, etc.)
        !           194: ** When deleting a directory of files, if the deletion of any one
        !           195: ** file fails (for example due to an I/O error), then this routine
        !           196: ** returns immediately, with the error code, and does not try to 
        !           197: ** delete any of the other files in the specified directory.
        !           198: **
        !           199: ** All files are removed from quota management and deleted from disk.
        !           200: ** However, no attempt is made to remove empty directories.
        !           201: **
        !           202: ** This routine is a no-op for files that are not under quota management.
        !           203: */
        !           204: int sqlite3_quota_remove(const char *zFilename);
        !           205: 
        !           206: #ifdef __cplusplus
        !           207: }  /* end of the 'extern "C"' block */
        !           208: #endif
        !           209: #endif /* _QUOTA_H_ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>