Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Modify the sqlite_encode_binary() routine to return the strlen() of the encoded string. Also fix a bug that occurs when attempting to encode a zero-length buffer. (CVS 751) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
f12c3a25ba5408c2a7c846a9f160416f |
User & Date: | drh 2002-09-16 11:44:06.000 |
Context
2002-09-17
| ||
03:20 | Fix a bug in the OP_MemStore operator of the VDBE. A realloc() might occur but pointer to the old buffer were not being moved over to the new buffer. (CVS 752) (check-in: 29145746f3 user: drh tags: trunk) | |
2002-09-16
| ||
11:44 | Modify the sqlite_encode_binary() routine to return the strlen() of the encoded string. Also fix a bug that occurs when attempting to encode a zero-length buffer. (CVS 751) (check-in: f12c3a25ba user: drh tags: trunk) | |
2002-09-14
| ||
13:47 | Do not put a write lock on the main database file when writing to a temporary table. (CVS 750) (check-in: 3f253afe15 user: drh tags: trunk) | |
Changes
Changes to src/encode.c.
︙ | ︙ | |||
11 12 13 14 15 16 17 | ************************************************************************* ** This file contains helper routines used to translate binary data into ** a null-terminated string (suitable for use in SQLite) and back again. ** These are convenience routines for use by people who want to store binary ** data in an SQLite database. The code in this file is used by any other ** part of the SQLite library. ** | | > > > | > > > > > | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | ************************************************************************* ** This file contains helper routines used to translate binary data into ** a null-terminated string (suitable for use in SQLite) and back again. ** These are convenience routines for use by people who want to store binary ** data in an SQLite database. The code in this file is used by any other ** part of the SQLite library. ** ** $Id: encode.c,v 1.3 2002/09/16 11:44:06 drh Exp $ */ /* ** Encode a binary buffer "in" of size n bytes so that it contains ** no instances of characters '\'' or '\000'. The output is ** null-terminated and can be used as a string value in an INSERT ** or UPDATE statement. Use sqlite_decode_binary() to convert the ** string back into its original binary. ** ** The result is written into a preallocated output buffer "out". ** "out" must be able to hold at least (256*n + 1262)/253 bytes. ** In other words, the output will be expanded by as much as 3 ** bytes for every 253 bytes of input plus 2 bytes of fixed overhead. ** (This is approximately 2 + 1.019*n or about a 2% size increase.) ** ** The return value is the number of characters in the encoded ** string, excluding the "\000" terminator. */ int sqlite_encode_binary(const unsigned char *in, int n, unsigned char *out){ int i, j, e, m; int cnt[256]; if( n<=0 ){ out[0] = 'x'; out[1] = 0; return 1; } memset(cnt, 0, sizeof(cnt)); for(i=n-1; i>=0; i--){ cnt[in[i]]++; } m = n; for(i=1; i<256; i++){ int sum; if( i=='\'' ) continue; sum = cnt[i] + cnt[(i+1)&0xff] + cnt[(i+'\'')&0xff]; |
︙ | ︙ | |||
60 61 62 63 64 65 66 | }else if( c=='\'' ){ out[j++] = 1; out[j++] = 3; }else{ out[j++] = c; } } | | > | 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | }else if( c=='\'' ){ out[j++] = 1; out[j++] = 3; }else{ out[j++] = c; } } out[j] = 0; return j; } /* ** Decode the string "in" into binary data and write it into "out". ** This routine reverses the encoded created by sqlite_encode_binary(). ** The output will always be a few bytes less than the input. The number ** of bytes of output is returned. If the input is not a well-formed |
︙ | ︙ | |||
102 103 104 105 106 107 108 | #ifdef ENCODER_TEST /* ** The subroutines above are not tested by the usual test suite. To test ** these routines, compile just this one file with a -DENCODER_TEST=1 option ** and run the result. */ int main(int argc, char **argv){ | | | > > > > | 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | #ifdef ENCODER_TEST /* ** The subroutines above are not tested by the usual test suite. To test ** these routines, compile just this one file with a -DENCODER_TEST=1 option ** and run the result. */ int main(int argc, char **argv){ int i, j, n, m, nOut; unsigned char in[30000]; unsigned char out[33000]; for(i=0; i<sizeof(in); i++){ printf("Test %d: ", i+1); n = rand() % (i+1); if( i%100==0 ){ int k; for(j=k=0; j<n; j++){ /* if( k==0 || k=='\'' ) k++; */ in[j] = k; k = (k+1)&0xff; } }else{ for(j=0; j<n; j++) in[j] = rand() & 0xff; } nOut = sqlite_encode_binary(in, n, out); if( nOut!=strlen(out) ){ printf(" ERROR return value is %d instead of %d\n", nOut, strlen(out)); exit(1); } m = (256*n + 1262)/253; printf("size %d->%d (max %d)", n, strlen(out)+1, m); if( strlen(out)+1>m ){ printf(" ERROR output too big\n"); exit(1); } for(j=0; out[j]; j++){ |
︙ | ︙ |