aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2004-02-11 09:46:30 +0000
committerdrh <drh@noemail.net>2004-02-11 09:46:30 +0000
commitbbd82df617ee94a0371e867a95cee007f4473bd8 (patch)
tree06f6f9a32dd4e4ae13675aa4f1e29aa07fdca9bc /src
parent9eb9e26b82e5b973f81f4429f9e1978a058391e9 (diff)
downloadsqlite-bbd82df617ee94a0371e867a95cee007f4473bd8.tar.gz
sqlite-bbd82df617ee94a0371e867a95cee007f4473bd8.zip
Refactor the interface to the randomness generator. (CVS 1224)
FossilOrigin-Name: f2bdccf4bb2f796aafb64c33e55f62a1794d750c
Diffstat (limited to 'src')
-rw-r--r--src/build.c6
-rw-r--r--src/func.c18
-rw-r--r--src/os.c28
-rw-r--r--src/pager.c4
-rw-r--r--src/random.c46
-rw-r--r--src/sqliteInt.h5
-rw-r--r--src/vacuum.c10
-rw-r--r--src/vdbe.c8
8 files changed, 59 insertions, 66 deletions
diff --git a/src/build.c b/src/build.c
index 20d574818..e7f56f7fe 100644
--- a/src/build.c
+++ b/src/build.c
@@ -23,7 +23,7 @@
** ROLLBACK
** PRAGMA
**
-** $Id: build.c,v 1.164 2004/01/19 04:55:56 jplyon Exp $
+** $Id: build.c,v 1.165 2004/02/11 09:46:31 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@@ -819,7 +819,9 @@ void sqliteAddCollateType(Parse *pParse, int collType){
*/
void sqliteChangeCookie(sqlite *db, Vdbe *v){
if( db->next_cookie==db->aDb[0].schema_cookie ){
- db->next_cookie = db->aDb[0].schema_cookie + sqliteRandomByte() + 1;
+ unsigned char r;
+ sqliteRandomness(1, &r);
+ db->next_cookie = db->aDb[0].schema_cookie + r + 1;
db->flags |= SQLITE_InternChanges;
sqliteVdbeAddOp(v, OP_Integer, db->next_cookie, 0);
sqliteVdbeAddOp(v, OP_SetCookie, 0, 0);
diff --git a/src/func.c b/src/func.c
index 68c272ac0..688f50cff 100644
--- a/src/func.c
+++ b/src/func.c
@@ -16,7 +16,7 @@
** sqliteRegisterBuildinFunctions() found at the bottom of the file.
** All other code has file scope.
**
-** $Id: func.c,v 1.38 2004/01/30 14:49:17 drh Exp $
+** $Id: func.c,v 1.39 2004/02/11 09:46:32 drh Exp $
*/
#include <ctype.h>
#include <math.h>
@@ -195,7 +195,9 @@ static void ifnullFunc(sqlite_func *context, int argc, const char **argv){
** Implementation of random(). Return a random integer.
*/
static void randomFunc(sqlite_func *context, int argc, const char **argv){
- sqlite_set_result_int(context, sqliteRandomInteger());
+ int r;
+ sqliteRandomness(sizeof(r), &r);
+ sqlite_set_result_int(context, r);
}
/*
@@ -341,13 +343,13 @@ static void soundexFunc(sqlite_func *context, int argc, const char **argv){
** generating test data.
*/
static void randStr(sqlite_func *context, int argc, const char **argv){
- static const char zSrc[] =
+ static const unsigned char zSrc[] =
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"0123456789"
".-!,:*^+=_|?/<> ";
int iMin, iMax, n, r, i;
- char zBuf[1000];
+ unsigned char zBuf[1000];
if( argc>=1 ){
iMin = atoi(argv[0]);
if( iMin<0 ) iMin = 0;
@@ -364,14 +366,14 @@ static void randStr(sqlite_func *context, int argc, const char **argv){
}
n = iMin;
if( iMax>iMin ){
- r = sqliteRandomInteger() & 0x7fffffff;
+ sqliteRandomness(sizeof(r), &r);
+ r &= 0x7fffffff;
n += r%(iMax + 1 - iMin);
}
assert( n<sizeof(zBuf) );
- r = 0;
+ sqliteRandomness(n, zBuf);
for(i=0; i<n; i++){
- r = (r + sqliteRandomByte())% (sizeof(zSrc)-1);
- zBuf[i] = zSrc[r];
+ zBuf[i] = zSrc[zBuf[i]%(sizeof(zSrc)-1)];
}
zBuf[n] = 0;
sqlite_set_result_string(context, zBuf, n);
diff --git a/src/os.c b/src/os.c
index 2c5707830..fb987f3ca 100644
--- a/src/os.c
+++ b/src/os.c
@@ -785,7 +785,7 @@ int sqliteOsTempFileName(char *zBuf){
"/tmp",
".",
};
- static char zChars[] =
+ static unsigned char zChars[] =
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"0123456789";
@@ -802,9 +802,9 @@ int sqliteOsTempFileName(char *zBuf){
do{
sprintf(zBuf, "%s/"TEMP_FILE_PREFIX, zDir);
j = strlen(zBuf);
- for(i=0; i<15; i++){
- int n = sqliteRandomByte() % (sizeof(zChars)-1);
- zBuf[j++] = zChars[n];
+ sqliteRandomness(15, &zBuf[j]);
+ for(i=0; i<15; i++, j++){
+ zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
}
zBuf[j] = 0;
}while( access(zBuf,0)==0 );
@@ -822,9 +822,9 @@ int sqliteOsTempFileName(char *zBuf){
for(;;){
sprintf(zBuf, "%s\\"TEMP_FILE_PREFIX, zTempPath);
j = strlen(zBuf);
- for(i=0; i<15; i++){
- int n = sqliteRandomByte() % (sizeof(zChars) - 1);
- zBuf[j++] = zChars[n];
+ sqliteRandomness(15, &zBuf[j]);
+ for(i=0; i<15; i++, j++){
+ zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
}
zBuf[j] = 0;
if( !sqliteOsFileExists(zBuf) ) break;
@@ -865,9 +865,9 @@ int sqliteOsTempFileName(char *zBuf){
for(;;){
sprintf(zBuf, "%s"TEMP_FILE_PREFIX, zTempPath);
j = strlen(zBuf);
- for(i=0; i<15; i++){
- int n = sqliteRandomByte() % sizeof(zChars);
- zBuf[j++] = zChars[n];
+ sqliteRandomness(15, &zBuf[j]);
+ for(i=0; i<15; i++, j++){
+ zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
}
zBuf[j] = 0;
if( !sqliteOsFileExists(zBuf) ) break;
@@ -1325,9 +1325,11 @@ int sqliteOsReadLock(OsFile *id){
if( id->locked>0 ){
rc = SQLITE_OK;
}else{
- int lk = (sqliteRandomInteger() & 0x7ffffff)%N_LOCKBYTE+1;
+ int lk;
int res;
int cnt = 100;
+ sqliteRandomness(sizeof(lk), &lk);
+ lk = (lk & 0x7fffffff)%N_LOCKBYTE + 1;
while( cnt-->0 && (res = LockFile(id->h, FIRST_LOCKBYTE, 0, 1, 0))==0 ){
Sleep(1);
}
@@ -1359,10 +1361,12 @@ int sqliteOsReadLock(OsFile *id){
if( id->locked>0 || id->refNumRF == -1 ){
rc = SQLITE_OK;
}else{
- int lk = (sqliteRandomInteger() & 0x7ffffff)%N_LOCKBYTE+1;
+ int lk;
OSErr res;
int cnt = 5;
ParamBlockRec params;
+ sqliteRandomness(sizeof(lk), &lk);
+ lk = (lk & 0x7fffffff)%N_LOCKBYTE + 1;
memset(&params, 0, sizeof(params));
params.ioParam.ioRefNum = id->refNumRF;
params.ioParam.ioPosMode = fsFromStart;
diff --git a/src/pager.c b/src/pager.c
index 990f41253..223de8e63 100644
--- a/src/pager.c
+++ b/src/pager.c
@@ -18,7 +18,7 @@
** file simultaneously, or one process from reading the database while
** another is writing.
**
-** @(#) $Id: pager.c,v 1.99 2004/02/11 02:18:07 drh Exp $
+** @(#) $Id: pager.c,v 1.100 2004/02/11 09:46:32 drh Exp $
*/
#include "os.h" /* Must be first to enable large file support */
#include "sqliteInt.h"
@@ -1664,7 +1664,7 @@ static int pager_open_journal(Pager *pPager){
rc = write32bits(&pPager->jfd, pPager->noSync ? 0xffffffff : 0);
}
if( rc==SQLITE_OK ){
- pPager->cksumInit = (u32)sqliteRandomInteger();
+ sqliteRandomness(sizeof(pPager->cksumInit), &pPager->cksumInit);
rc = write32bits(&pPager->jfd, pPager->cksumInit);
}
}else if( journal_format==JOURNAL_FORMAT_2 ){
diff --git a/src/random.c b/src/random.c
index 39148b490..bf4b6d0a9 100644
--- a/src/random.c
+++ b/src/random.c
@@ -15,7 +15,7 @@
** Random numbers are used by some of the database backends in order
** to generate random integer keys for tables or random filenames.
**
-** $Id: random.c,v 1.10 2002/02/19 13:39:23 drh Exp $
+** $Id: random.c,v 1.11 2004/02/11 09:46:33 drh Exp $
*/
#include "sqliteInt.h"
#include "os.h"
@@ -35,15 +35,15 @@
** on RC4, which we know works very well.
*/
static int randomByte(){
- int t;
+ unsigned char t;
/* All threads share a single random number generator.
** This structure is the current state of the generator.
*/
static struct {
- int isInit; /* True if initialized */
- int i, j; /* State variables */
- int s[256]; /* State variables */
+ unsigned char isInit; /* True if initialized */
+ unsigned char i, j; /* State variables */
+ unsigned char s[256]; /* State variables */
} prng;
/* Initialize the state of the random number generator once,
@@ -65,8 +65,7 @@ static int randomByte(){
prng.s[i] = i;
}
for(i=0; i<256; i++){
- int t;
- prng.j = (prng.j + prng.s[i] + k[i]) & 0xff;
+ prng.j += prng.s[i] + k[i];
t = prng.s[prng.j];
prng.s[prng.j] = prng.s[i];
prng.s[i] = t;
@@ -76,38 +75,23 @@ static int randomByte(){
/* Generate and return single random byte
*/
- prng.i = (prng.i + 1) & 0xff;
- prng.j = (prng.j + prng.s[prng.i]) & 0xff;
+ prng.i++;
t = prng.s[prng.i];
+ prng.j += t;
prng.s[prng.i] = prng.s[prng.j];
prng.s[prng.j] = t;
- t = prng.s[prng.i] + prng.s[prng.j];
- return prng.s[t & 0xff];
+ t += prng.s[prng.i];
+ return prng.s[t];
}
/*
-** Return an random 8-bit integer.
+** Return N random bytes.
*/
-int sqliteRandomByte(){
- int r;
+void sqliteRandomness(int N, void *pBuf){
+ unsigned char *zBuf = pBuf;
sqliteOsEnterMutex();
- r = randomByte();
- sqliteOsLeaveMutex();
- return r;
-}
-
-/*
-** Return a random 32-bit integer. The integer is generated by making
-** 4 calls to sqliteRandomByte().
-*/
-int sqliteRandomInteger(){
- int r;
- int i;
- sqliteOsEnterMutex();
- r = randomByte();
- for(i=1; i<4; i++){
- r = (r<<8) + randomByte();
+ while( N-- ){
+ *(zBuf++) = randomByte();
}
sqliteOsLeaveMutex();
- return r;
}
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index 381b538e6..4b6402c82 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -11,7 +11,7 @@
*************************************************************************
** Internal interface definitions for SQLite.
**
-** @(#) $Id: sqliteInt.h,v 1.209 2004/01/16 15:55:38 drh Exp $
+** @(#) $Id: sqliteInt.h,v 1.210 2004/02/11 09:46:33 drh Exp $
*/
#include "config.h"
#include "sqlite.h"
@@ -1151,8 +1151,7 @@ int sqliteFuncId(Token*);
int sqliteExprResolveIds(Parse*, SrcList*, ExprList*, Expr*);
int sqliteExprAnalyzeAggregates(Parse*, Expr*);
Vdbe *sqliteGetVdbe(Parse*);
-int sqliteRandomByte(void);
-int sqliteRandomInteger(void);
+void sqliteRandomness(int, void*);
void sqliteRollbackAll(sqlite*);
void sqliteCodeVerifySchema(Parse*, int);
void sqliteBeginTransaction(Parse*, int);
diff --git a/src/vacuum.c b/src/vacuum.c
index 95e7add47..623bc3fc1 100644
--- a/src/vacuum.c
+++ b/src/vacuum.c
@@ -14,7 +14,7 @@
** Most of the code in this file may be omitted by defining the
** SQLITE_OMIT_VACUUM macro.
**
-** $Id: vacuum.c,v 1.9 2003/12/07 00:24:35 drh Exp $
+** $Id: vacuum.c,v 1.10 2004/02/11 09:46:33 drh Exp $
*/
#include "sqliteInt.h"
#include "os.h"
@@ -185,14 +185,14 @@ static int vacuumCallback3(void *pArg, int argc, char **argv, char **NotUsed){
/*
** Generate a random name of 20 character in length.
*/
-static void randomName(char *zBuf){
- static const char zChars[] =
+static void randomName(unsigned char *zBuf){
+ static const unsigned char zChars[] =
"abcdefghijklmnopqrstuvwxyz"
"0123456789";
int i;
+ sqliteRandomness(20, zBuf);
for(i=0; i<20; i++){
- int n = sqliteRandomByte() % (sizeof(zChars)-1);
- zBuf[i] = zChars[n];
+ zBuf[i] = zChars[ zBuf[i]%(sizeof(zChars)-1) ];
}
}
#endif
diff --git a/src/vdbe.c b/src/vdbe.c
index 0e3d8bc33..1288502cd 100644
--- a/src/vdbe.c
+++ b/src/vdbe.c
@@ -43,7 +43,7 @@
** in this file for details. If in doubt, do not deviate from existing
** commenting and indentation practices when changing or adding code.
**
-** $Id: vdbe.c,v 1.258 2004/02/10 13:41:52 drh Exp $
+** $Id: vdbe.c,v 1.259 2004/02/11 09:46:33 drh Exp $
*/
#include "sqliteInt.h"
#include "os.h"
@@ -2893,10 +2893,12 @@ case OP_NewRecno: {
cnt = 0;
do{
if( v==0 || cnt>2 ){
- v = sqliteRandomInteger();
+ sqliteRandomness(sizeof(v), &v);
if( cnt<5 ) v &= 0xffffff;
}else{
- v += sqliteRandomByte() + 1;
+ unsigned char r;
+ sqliteRandomness(1, &r);
+ v += r + 1;
}
if( v==0 ) continue;
x = intToKey(v);