📄 util.c
字号:
**** 7 bits - A** 14 bits - BA** 21 bits - BBA** 28 bits - BBBA** 35 bits - BBBBA** 42 bits - BBBBBA** 49 bits - BBBBBBA** 56 bits - BBBBBBBA** 64 bits - BBBBBBBBC*//*** Write a 64-bit variable-length integer to memory starting at p[0].** The length of data write will be between 1 and 9 bytes. The number** of bytes written is returned.**** A variable-length integer consists of the lower 7 bits of each byte** for all bytes that have the 8th bit set and one byte with the 8th** bit clear. Except, if we get to the 9th byte, it stores the full** 8 bits and is the last byte.*/int sqlite3PutVarint(unsigned char *p, u64 v){ int i, j, n; u8 buf[10]; if( v & (((u64)0xff000000)<<32) ){ p[8] = v; v >>= 8; for(i=7; i>=0; i--){ p[i] = (v & 0x7f) | 0x80; v >>= 7; } return 9; } n = 0; do{ buf[n++] = (v & 0x7f) | 0x80; v >>= 7; }while( v!=0 ); buf[0] &= 0x7f; assert( n<=9 ); for(i=0, j=n-1; j>=0; j--, i++){ p[i] = buf[j]; } return n;}/*** This routine is a faster version of sqlite3PutVarint() that only** works for 32-bit positive integers and which is optimized for** the common case of small integers. A MACRO version, putVarint32,** is provided which inlines the single-byte case. All code should use** the MACRO version as this function assumes the single-byte case has** already been handled.*/int sqlite3PutVarint32(unsigned char *p, u32 v){#ifndef putVarint32 if( (v & ~0x7f)==0 ){ p[0] = v; return 1; }#endif if( (v & ~0x3fff)==0 ){ p[0] = (v>>7) | 0x80; p[1] = v & 0x7f; return 2; } return sqlite3PutVarint(p, v);}/*** Read a 64-bit variable-length integer from memory starting at p[0].** Return the number of bytes read. The value is stored in *v.*/int sqlite3GetVarint(const unsigned char *p, u64 *v){ u32 a,b,s; a = *p; /* a: p0 (unmasked) */ if (!(a&0x80)) { *v = a; return 1; } p++; b = *p; /* b: p1 (unmasked) */ if (!(b&0x80)) { a &= 0x7f; a = a<<7; a |= b; *v = a; return 2; } p++; a = a<<14; a |= *p; /* a: p0<<14 | p2 (unmasked) */ if (!(a&0x80)) { a &= (0x7f<<14)|(0x7f); b &= 0x7f; b = b<<7; a |= b; *v = a; return 3; } /* CSE1 from below */ a &= (0x7f<<14)|(0x7f); p++; b = b<<14; b |= *p; /* b: p1<<14 | p3 (unmasked) */ if (!(b&0x80)) { b &= (0x7f<<14)|(0x7f); /* moved CSE1 up */ /* a &= (0x7f<<14)|(0x7f); */ a = a<<7; a |= b; *v = a; return 4; } /* a: p0<<14 | p2 (masked) */ /* b: p1<<14 | p3 (unmasked) */ /* 1:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ /* moved CSE1 up */ /* a &= (0x7f<<14)|(0x7f); */ b &= (0x7f<<14)|(0x7f); s = a; /* s: p0<<14 | p2 (masked) */ p++; a = a<<14; a |= *p; /* a: p0<<28 | p2<<14 | p4 (unmasked) */ if (!(a&0x80)) { /* we can skip these cause they were (effectively) done above in calc'ing s */ /* a &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ /* b &= (0x7f<<14)|(0x7f); */ b = b<<7; a |= b; s = s>>18; *v = ((u64)s)<<32 | a; return 5; } /* 2:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ s = s<<7; s |= b; /* s: p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ p++; b = b<<14; b |= *p; /* b: p1<<28 | p3<<14 | p5 (unmasked) */ if (!(b&0x80)) { /* we can skip this cause it was (effectively) done above in calc'ing s */ /* b &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ a &= (0x7f<<14)|(0x7f); a = a<<7; a |= b; s = s>>18; *v = ((u64)s)<<32 | a; return 6; } p++; a = a<<14; a |= *p; /* a: p2<<28 | p4<<14 | p6 (unmasked) */ if (!(a&0x80)) { a &= (0x7f<<28)|(0x7f<<14)|(0x7f); b &= (0x7f<<14)|(0x7f); b = b<<7; a |= b; s = s>>11; *v = ((u64)s)<<32 | a; return 7; } /* CSE2 from below */ a &= (0x7f<<14)|(0x7f); p++; b = b<<14; b |= *p; /* b: p3<<28 | p5<<14 | p7 (unmasked) */ if (!(b&0x80)) { b &= (0x7f<<28)|(0x7f<<14)|(0x7f); /* moved CSE2 up */ /* a &= (0x7f<<14)|(0x7f); */ a = a<<7; a |= b; s = s>>4; *v = ((u64)s)<<32 | a; return 8; } p++; a = a<<15; a |= *p; /* a: p4<<29 | p6<<15 | p8 (unmasked) */ /* moved CSE2 up */ /* a &= (0x7f<<29)|(0x7f<<15)|(0xff); */ b &= (0x7f<<14)|(0x7f); b = b<<8; a |= b; s = s<<4; b = p[-4]; b &= 0x7f; b = b>>3; s |= b; *v = ((u64)s)<<32 | a; return 9;}/*** Read a 32-bit variable-length integer from memory starting at p[0].** Return the number of bytes read. The value is stored in *v.** A MACRO version, getVarint32, is provided which inlines the ** single-byte case. All code should use the MACRO version as ** this function assumes the single-byte case has already been handled.*/int sqlite3GetVarint32(const unsigned char *p, u32 *v){ u32 a,b; a = *p; /* a: p0 (unmasked) */#ifndef getVarint32 if (!(a&0x80)) { *v = a; return 1; }#endif p++; b = *p; /* b: p1 (unmasked) */ if (!(b&0x80)) { a &= 0x7f; a = a<<7; *v = a | b; return 2; } p++; a = a<<14; a |= *p; /* a: p0<<14 | p2 (unmasked) */ if (!(a&0x80)) { a &= (0x7f<<14)|(0x7f); b &= 0x7f; b = b<<7; *v = a | b; return 3; } p++; b = b<<14; b |= *p; /* b: p1<<14 | p3 (unmasked) */ if (!(b&0x80)) { b &= (0x7f<<14)|(0x7f); a &= (0x7f<<14)|(0x7f); a = a<<7; *v = a | b; return 4; } p++; a = a<<14; a |= *p; /* a: p0<<28 | p2<<14 | p4 (unmasked) */ if (!(a&0x80)) { a &= (0x7f<<28)|(0x7f<<14)|(0x7f); b &= (0x7f<<28)|(0x7f<<14)|(0x7f); b = b<<7; *v = a | b; return 5; } /* We can only reach this point when reading a corrupt database ** file. In that case we are not in any hurry. Use the (relatively ** slow) general-purpose sqlite3GetVarint() routine to extract the ** value. */ { u64 v64; int n; p -= 4; n = sqlite3GetVarint(p, &v64); assert( n>5 && n<=9 ); *v = (u32)v64; return n; }}/*** Return the number of bytes that will be needed to store the given** 64-bit integer.*/int sqlite3VarintLen(u64 v){ int i = 0; do{ i++; v >>= 7; }while( v!=0 && i<9 ); return i;}/*** Read or write a four-byte big-endian integer value.*/u32 sqlite3Get4byte(const u8 *p){ return (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];}void sqlite3Put4byte(unsigned char *p, u32 v){ p[0] = v>>24; p[1] = v>>16; p[2] = v>>8; p[3] = v;}#if !defined(SQLITE_OMIT_BLOB_LITERAL) || defined(SQLITE_HAS_CODEC)/*** Translate a single byte of Hex into an integer.** This routinen only works if h really is a valid hexadecimal** character: 0..9a..fA..F*/static int hexToInt(int h){ assert( (h>='0' && h<='9') || (h>='a' && h<='f') || (h>='A' && h<='F') );#ifdef SQLITE_ASCII h += 9*(1&(h>>6));#endif#ifdef SQLITE_EBCDIC h += 9*(1&~(h>>4));#endif return h & 0xf;}#endif /* !SQLITE_OMIT_BLOB_LITERAL || SQLITE_HAS_CODEC */#if !defined(SQLITE_OMIT_BLOB_LITERAL) || defined(SQLITE_HAS_CODEC)/*** Convert a BLOB literal of the form "x'hhhhhh'" into its binary** value. Return a pointer to its binary value. Space to hold the** binary value has been obtained from malloc and must be freed by** the calling routine.*/void *sqlite3HexToBlob(sqlite3 *db, const char *z, int n){ char *zBlob; int i; zBlob = (char *)sqlite3DbMallocRaw(db, n/2 + 1); n--; if( zBlob ){ for(i=0; i<n; i+=2){ zBlob[i/2] = (hexToInt(z[i])<<4) | hexToInt(z[i+1]); } zBlob[i/2] = 0; } return zBlob;}#endif /* !SQLITE_OMIT_BLOB_LITERAL || SQLITE_HAS_CODEC *//*** Change the sqlite.magic from SQLITE_MAGIC_OPEN to SQLITE_MAGIC_BUSY.** Return an error (non-zero) if the magic was not SQLITE_MAGIC_OPEN** when this routine is called.**** This routine is called when entering an SQLite API. The SQLITE_MAGIC_OPEN** value indicates that the database connection passed into the API is** open and is not being used by another thread. By changing the value** to SQLITE_MAGIC_BUSY we indicate that the connection is in use.** sqlite3SafetyOff() below will change the value back to SQLITE_MAGIC_OPEN** when the API exits. **** This routine is a attempt to detect if two threads use the** same sqlite* pointer at the same time. There is a race ** condition so it is possible that the error is not detected.** But usually the problem will be seen. The result will be an** error which can be used to debug the application that is** using SQLite incorrectly.**** Ticket #202: If db->magic is not a valid open value, take care not** to modify the db structure at all. It could be that db is a stale** pointer. In other words, it could be that there has been a prior** call to sqlite3_close(db) and db has been deallocated. And we do** not want to write into deallocated memory.*/#ifdef SQLITE_DEBUGint sqlite3SafetyOn(sqlite3 *db){ if( db->magic==SQLITE_MAGIC_OPEN ){ db->magic = SQLITE_MAGIC_BUSY; assert( sqlite3_mutex_held(db->mutex) ); return 0; }else if( db->magic==SQLITE_MAGIC_BUSY ){ db->magic = SQLITE_MAGIC_ERROR; db->u1.isInterrupted = 1; } return 1;}#endif/*** Change the magic from SQLITE_MAGIC_BUSY to SQLITE_MAGIC_OPEN.** Return an error (non-zero) if the magic was not SQLITE_MAGIC_BUSY** when this routine is called.*/#ifdef SQLITE_DEBUGint sqlite3SafetyOff(sqlite3 *db){ if( db->magic==SQLITE_MAGIC_BUSY ){ db->magic = SQLITE_MAGIC_OPEN; assert( sqlite3_mutex_held(db->mutex) ); return 0; }else{ db->magic = SQLITE_MAGIC_ERROR; db->u1.isInterrupted = 1; return 1; }}#endif/*** Check to make sure we have a valid db pointer. This test is not** foolproof but it does provide some measure of protection against** misuse of the interface such as passing in db pointers that are** NULL or which have been previously closed. If this routine returns** 1 it means that the db pointer is valid and 0 if it should not be** dereferenced for any reason. The calling function should invoke** SQLITE_MISUSE immediately.**** sqlite3SafetyCheckOk() requires that the db pointer be valid for** use. sqlite3SafetyCheckSickOrOk() allows a db pointer that failed to** open properly and is not fit for general use but which can be** used as an argument to sqlite3_errmsg() or sqlite3_close().*/int sqlite3SafetyCheckOk(sqlite3 *db){ u32 magic; if( db==0 ) return 0; magic = db->magic; if( magic!=SQLITE_MAGIC_OPEN && magic!=SQLITE_MAGIC_BUSY ) return 0; return 1;}int sqlite3SafetyCheckSickOrOk(sqlite3 *db){ u32 magic; if( db==0 ) return 0; magic = db->magic; if( magic!=SQLITE_MAGIC_SICK && magic!=SQLITE_MAGIC_OPEN && magic!=SQLITE_MAGIC_BUSY ) return 0; return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -