⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util.c

📁 sqlite的最新源码 This ZIP archive contains preprocessed C code for the SQLite library as individual sour
💻 C
📖 第 1 页 / 共 2 页
字号:
****  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 + -