描述
该函数允许通过连接基础在连接上限制各种构造的大小。
C / C ++语法
int sqlite3_limit(sqlite3*, int id, int newVal); |
PB语法
FUNCTION sqlite3_limit ( _ BYVAL hDbc AS DWORD, _ BYVAL id AS LONG, _ BYVAL newVal AS LONG _ ) AS QUAD |
参数
pDb
[in]要限制其设置或查询的数据库连接。
id
[in]限制类别中定义一类要限制大小的构造之一。
newVal
[in]该结构的新限制。
返回值
上限值的限制。
备注
如果新限制为负数,则限制不变。对于每个限制类别SQLITE_LIMIT_NAME,编译时由称为SQLITE_MAX_NAME的C预处理器宏设置一个硬上限。(名称中的“_LIMIT_”更改为“_MAX_”。)尝试增加超过其上限的限制将被静默地截断为硬上限。
无论限制是否改变,sqlite3_limit接口返回上限值。因此,要在不更改限制的情况下查找当前值,只需将第三个参数设置为-1即可调用此接口。
运行时间限制用于管理自己的内部数据库的应用程序以及由不受信任的外部源控制的数据库。示例应用程序可能是具有自己的数据库的Web浏览器,用于存储历史记录和由Internet下载的JavaScript应用程序控制的单独数据库。内部数据库可以被赋予大的默认限制。由外部源管理的数据库可以给予更小的限制,旨在防止拒绝服务攻击。开发人员也可能希望使用sqlite3_set_authorizer接口来进一步控制不受信任的SQL。可以使用max_page_count PRAGMA包含由不受信任脚本创建的数据库的大小。
新的运行时间限制类别可能会在以后的版本中添加。
C ++实现代码
/*
** Change the value of a limit. Report the old value.
** If an invalid limit index is supplied, report -1.
** Make no changes but still report the old value if the
** new limit is negative.
**
** A new lower limit does not shrink existing constructs.
** It merely prevents new constructs that exceed the limit
** from forming.
*/
SQLITE_API int sqlite3_limit(sqlite3 *db, int limitId, int newLimit){
int oldLimit;
/* EVIDENCE-OF: R-30189-54097 For each limit category SQLITE_LIMIT_NAME
** there is a hard upper bound set at compile-time by a C preprocessor
** macro called SQLITE_MAX_NAME. (The "_LIMIT_" in the name is changed to
** "_MAX_".)
*/
assert( aHardLimit[SQLITE_LIMIT_LENGTH]==SQLITE_MAX_LENGTH );
assert( aHardLimit[SQLITE_LIMIT_SQL_LENGTH]==SQLITE_MAX_SQL_LENGTH );
assert( aHardLimit[SQLITE_LIMIT_COLUMN]==SQLITE_MAX_COLUMN );
assert( aHardLimit[SQLITE_LIMIT_EXPR_DEPTH]==SQLITE_MAX_EXPR_DEPTH );
assert( aHardLimit[SQLITE_LIMIT_COMPOUND_SELECT]==SQLITE_MAX_COMPOUND_SELECT);
assert( aHardLimit[SQLITE_LIMIT_VDBE_OP]==SQLITE_MAX_VDBE_OP );
assert( aHardLimit[SQLITE_LIMIT_FUNCTION_ARG]==SQLITE_MAX_FUNCTION_ARG );
assert( aHardLimit[SQLITE_LIMIT_ATTACHED]==SQLITE_MAX_ATTACHED );
assert( aHardLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]==
SQLITE_MAX_LIKE_PATTERN_LENGTH );
assert( aHardLimit[SQLITE_LIMIT_VARIABLE_NUMBER]==SQLITE_MAX_VARIABLE_NUMBER);
assert( aHardLimit[SQLITE_LIMIT_TRIGGER_DEPTH]==SQLITE_MAX_TRIGGER_DEPTH );
assert( SQLITE_LIMIT_TRIGGER_DEPTH==(SQLITE_N_LIMIT-1) );
if( limitId<0 || limitId>=SQLITE_N_LIMIT ){
return -1;
}
oldLimit = db->aLimit[limitId];
if( newLimit>=0 ){ /* IMP: R-52476-28732 */
if( newLimit>aHardLimit[limitId] ){
newLimit = aHardLimit[limitId]; /* IMP: R-51463-25634 */
}
db->aLimit[limitId] = newLimit;
}
return oldLimit; /* IMP: R-53341-35419 */
}