Annotation of embedaddon/php/ext/dba/libflatfile/flatfile.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:    +----------------------------------------------------------------------+
                      3:    | PHP Version 5                                                        |
                      4:    +----------------------------------------------------------------------+
                      5:    | Copyright (c) 1997-2010 The PHP Group                                |
                      6:    +----------------------------------------------------------------------+
                      7:    | This source file is subject to version 3.01 of the PHP license,      |
                      8:    | that is bundled with this package in the file LICENSE, and is        |
                      9:    | available through the world-wide-web at the following url:           |
                     10:    | http://www.php.net/license/3_01.txt                                  |
                     11:    | If you did not receive a copy of the PHP license and are unable to   |
                     12:    | obtain it through the world-wide-web, please send a note to          |
                     13:    | license@php.net so we can mail you a copy immediately.               |
                     14:    +----------------------------------------------------------------------+
                     15:    | Authors: Marcus Boerger <helly@php.net>                              |
                     16:    | based on ext/db/db.c by:                                             |
                     17:    |          Rasmus Lerdorf <rasmus@php.net>                             |
                     18:    |          Jim Winstead <jimw@php.net>                                 |
                     19:    +----------------------------------------------------------------------+
                     20:  */
                     21: 
                     22: /* $Id: flatfile.c 306527 2010-12-20 23:00:11Z iliaa $ */
                     23: 
                     24: #ifdef HAVE_CONFIG_H
                     25: #include "config.h"
                     26: #endif
                     27: 
                     28: #include "php.h"
                     29: #include "php_globals.h"
                     30: #include "safe_mode.h"
                     31: 
                     32: #include <stdlib.h>
                     33: #include <string.h>
                     34: #include <errno.h>
                     35: #if HAVE_UNISTD_H
                     36: #include <unistd.h>
                     37: #endif
                     38: 
                     39: #include "flatfile.h"
                     40: 
                     41: #define FLATFILE_BLOCK_SIZE 1024
                     42: 
                     43: /*
                     44:  * ret = -1 means that database was opened for read-only
                     45:  * ret = 0  success
                     46:  * ret = 1  key already exists - nothing done
                     47:  */
                     48: 
                     49: /* {{{ flatfile_store
                     50:  */
                     51: int flatfile_store(flatfile *dba, datum key_datum, datum value_datum, int mode TSRMLS_DC) {
                     52:        if (mode == FLATFILE_INSERT) {
                     53:                if (flatfile_findkey(dba, key_datum TSRMLS_CC)) {
                     54:                        return 1;
                     55:                }
                     56:                php_stream_seek(dba->fp, 0L, SEEK_END);
                     57:                php_stream_printf(dba->fp TSRMLS_CC, "%zu\n", key_datum.dsize);
                     58:                php_stream_flush(dba->fp);
                     59:                if (php_stream_write(dba->fp, key_datum.dptr, key_datum.dsize) < key_datum.dsize) {
                     60:                        return -1;
                     61:                }
                     62:                php_stream_printf(dba->fp TSRMLS_CC, "%zu\n", value_datum.dsize);
                     63:                php_stream_flush(dba->fp);
                     64:                if (php_stream_write(dba->fp, value_datum.dptr, value_datum.dsize) < value_datum.dsize) {
                     65:                        return -1;
                     66:                }
                     67:        } else { /* FLATFILE_REPLACE */
                     68:                flatfile_delete(dba, key_datum TSRMLS_CC);
                     69:                php_stream_printf(dba->fp TSRMLS_CC, "%zu\n", key_datum.dsize);
                     70:                php_stream_flush(dba->fp);
                     71:                if (php_stream_write(dba->fp, key_datum.dptr, key_datum.dsize) < key_datum.dsize) {
                     72:                        return -1;
                     73:                }
                     74:                php_stream_printf(dba->fp TSRMLS_CC, "%zu\n", value_datum.dsize);
                     75:                if (php_stream_write(dba->fp, value_datum.dptr, value_datum.dsize) < value_datum.dsize) {
                     76:                        return -1;
                     77:                }
                     78:        }
                     79: 
                     80:        php_stream_flush(dba->fp);
                     81:        return 0;
                     82: }
                     83: /* }}} */
                     84: 
                     85: /* {{{ flatfile_fetch
                     86:  */
                     87: datum flatfile_fetch(flatfile *dba, datum key_datum TSRMLS_DC) {
                     88:        datum value_datum = {NULL, 0};
                     89:        char buf[16];
                     90: 
                     91:        if (flatfile_findkey(dba, key_datum TSRMLS_CC)) {
                     92:                if (php_stream_gets(dba->fp, buf, sizeof(buf))) {
                     93:                        value_datum.dsize = atoi(buf);
                     94:                        value_datum.dptr = safe_emalloc(value_datum.dsize, 1, 1);
                     95:                        value_datum.dsize = php_stream_read(dba->fp, value_datum.dptr, value_datum.dsize);
                     96:                } else {
                     97:                        value_datum.dptr = NULL;
                     98:                        value_datum.dsize = 0;
                     99:                }
                    100:        }
                    101:        return value_datum;
                    102: }
                    103: /* }}} */
                    104: 
                    105: /* {{{ flatfile_delete
                    106:  */
                    107: int flatfile_delete(flatfile *dba, datum key_datum TSRMLS_DC) {
                    108:        char *key = key_datum.dptr;
                    109:        size_t size = key_datum.dsize;
                    110:        size_t buf_size = FLATFILE_BLOCK_SIZE;
                    111:        char *buf = emalloc(buf_size);
                    112:        size_t num;
                    113:        size_t pos;
                    114: 
                    115:        php_stream_rewind(dba->fp);
                    116:        while(!php_stream_eof(dba->fp)) {
                    117:                /* read in the length of the key name */
                    118:                if (!php_stream_gets(dba->fp, buf, 15)) {
                    119:                        break;
                    120:                }
                    121:                num = atoi(buf);
                    122:                if (num >= buf_size) {
                    123:                        buf_size = num + FLATFILE_BLOCK_SIZE;
                    124:                        buf = erealloc(buf, buf_size);
                    125:                }
                    126:                pos = php_stream_tell(dba->fp);
                    127: 
                    128:                /* read in the key name */
                    129:                num = php_stream_read(dba->fp, buf, num);
                    130:                if (num < 0)  {
                    131:                        break;
                    132:                }
                    133: 
                    134:                if (size == num && !memcmp(buf, key, size)) {
                    135:                        php_stream_seek(dba->fp, pos, SEEK_SET);
                    136:                        php_stream_putc(dba->fp, 0);
                    137:                        php_stream_flush(dba->fp);
                    138:                        php_stream_seek(dba->fp, 0L, SEEK_END);
                    139:                        efree(buf);
                    140:                        return SUCCESS;
                    141:                }       
                    142: 
                    143:                /* read in the length of the value */
                    144:                if (!php_stream_gets(dba->fp, buf, 15)) {
                    145:                        break;
                    146:                }
                    147:                num = atoi(buf);
                    148:                if (num >= buf_size) {
                    149:                        buf_size = num + FLATFILE_BLOCK_SIZE;
                    150:                        buf = erealloc(buf, buf_size);
                    151:                }
                    152:                /* read in the value */
                    153:                num = php_stream_read(dba->fp, buf, num);
                    154:                if (num < 0) {
                    155:                        break;
                    156:                }
                    157:        }
                    158:        efree(buf);
                    159:        return FAILURE;
                    160: }      
                    161: /* }}} */
                    162: 
                    163: /* {{{ flatfile_findkey
                    164:  */
                    165: int flatfile_findkey(flatfile *dba, datum key_datum TSRMLS_DC) {
                    166:        size_t buf_size = FLATFILE_BLOCK_SIZE;
                    167:        char *buf = emalloc(buf_size);
                    168:        size_t num;
                    169:        int ret=0;
                    170:        void *key = key_datum.dptr;
                    171:        size_t size = key_datum.dsize;
                    172: 
                    173:        php_stream_rewind(dba->fp);
                    174:        while (!php_stream_eof(dba->fp)) {
                    175:                if (!php_stream_gets(dba->fp, buf, 15)) {
                    176:                        break;
                    177:                }
                    178:                num = atoi(buf);
                    179:                if (num >= buf_size) {
                    180:                        buf_size = num + FLATFILE_BLOCK_SIZE;
                    181:                        buf = erealloc(buf, buf_size);
                    182:                }
                    183:                num = php_stream_read(dba->fp, buf, num);
                    184:                if (num < 0) {
                    185:                        break;
                    186:                }
                    187:                if (size == num) {
                    188:                        if (!memcmp(buf, key, size)) {
                    189:                                ret = 1;
                    190:                                break;
                    191:                        }
                    192:                }       
                    193:                if (!php_stream_gets(dba->fp, buf, 15)) {
                    194:                        break;
                    195:                }
                    196:                num = atoi(buf);
                    197:                if (num >= buf_size) {
                    198:                        buf_size = num + FLATFILE_BLOCK_SIZE;
                    199:                        buf = erealloc(buf, buf_size);
                    200:                }
                    201:                num = php_stream_read(dba->fp, buf, num);
                    202:                if (num < 0) {
                    203:                        break;
                    204:                }
                    205:        }
                    206:        efree(buf);
                    207:        return ret;
                    208: }
                    209: /* }}} */
                    210: 
                    211: /* {{{ flatfile_firstkey
                    212:  */
                    213: datum flatfile_firstkey(flatfile *dba TSRMLS_DC) {
                    214:        datum res;
                    215:        size_t num;
                    216:        size_t buf_size = FLATFILE_BLOCK_SIZE;
                    217:        char *buf = emalloc(buf_size);
                    218: 
                    219:        php_stream_rewind(dba->fp);
                    220:        while(!php_stream_eof(dba->fp)) {
                    221:                if (!php_stream_gets(dba->fp, buf, 15)) {
                    222:                        break;
                    223:                }
                    224:                num = atoi(buf);
                    225:                if (num >= buf_size) {
                    226:                        buf_size = num + FLATFILE_BLOCK_SIZE;
                    227:                        buf = erealloc(buf, buf_size);
                    228:                }
                    229:                num = php_stream_read(dba->fp, buf, num);
                    230:                if (num < 0) {
                    231:                        break;
                    232:                }
                    233:                if (*(buf) != 0) {
                    234:                        dba->CurrentFlatFilePos = php_stream_tell(dba->fp);
                    235:                        res.dptr = buf;
                    236:                        res.dsize = num;
                    237:                        return res;
                    238:                }
                    239:                if (!php_stream_gets(dba->fp, buf, 15)) {
                    240:                        break;
                    241:                }
                    242:                num = atoi(buf);
                    243:                if (num >= buf_size) {
                    244:                        buf_size = num + FLATFILE_BLOCK_SIZE;
                    245:                        buf = erealloc(buf, buf_size);
                    246:                }
                    247:                num = php_stream_read(dba->fp, buf, num);
                    248:                if (num < 0) {
                    249:                        break;
                    250:                }
                    251:        }
                    252:        efree(buf);
                    253:        res.dptr = NULL;
                    254:        res.dsize = 0;
                    255:        return res;
                    256: }
                    257: /* }}} */
                    258: 
                    259: /* {{{ flatfile_nextkey
                    260:  */
                    261: datum flatfile_nextkey(flatfile *dba TSRMLS_DC) {
                    262:        datum res;
                    263:        size_t num;
                    264:        size_t buf_size = FLATFILE_BLOCK_SIZE;
                    265:        char *buf = emalloc(buf_size);
                    266: 
                    267:        php_stream_seek(dba->fp, dba->CurrentFlatFilePos, SEEK_SET);
                    268:        while(!php_stream_eof(dba->fp)) {
                    269:                if (!php_stream_gets(dba->fp, buf, 15)) {
                    270:                        break;
                    271:                }
                    272:                num = atoi(buf);
                    273:                if (num >= buf_size) {
                    274:                        buf_size = num + FLATFILE_BLOCK_SIZE;
                    275:                        buf = erealloc(buf, buf_size);
                    276:                }
                    277:                num = php_stream_read(dba->fp, buf, num);
                    278:                if (num < 0)  {
                    279:                        break;
                    280:                }
                    281:                if (!php_stream_gets(dba->fp, buf, 15)) {
                    282:                        break;
                    283:                }
                    284:                num = atoi(buf);
                    285:                if (num >= buf_size) {
                    286:                        buf_size = num + FLATFILE_BLOCK_SIZE;
                    287:                        buf = erealloc(buf, buf_size);
                    288:                }
                    289:                num = php_stream_read(dba->fp, buf, num);
                    290:                if (num < 0) {
                    291:                        break;
                    292:                }
                    293:                if (*(buf)!=0) {
                    294:                        dba->CurrentFlatFilePos = php_stream_tell(dba->fp);
                    295:                        res.dptr = buf;
                    296:                        res.dsize = num;
                    297:                        return res;
                    298:                }
                    299:        }
                    300:        efree(buf);
                    301:        res.dptr = NULL;
                    302:        res.dsize = 0;
                    303:        return res;
                    304: }      
                    305: /* }}} */
                    306: 
                    307: /* {{{ flatfile_version */
                    308: char *flatfile_version() 
                    309: {
                    310:        return "1.0, $Revision: 306527 $";
                    311: }
                    312: /* }}} */ 
                    313: 
                    314: /*
                    315:  * Local variables:
                    316:  * tab-width: 4
                    317:  * c-basic-offset: 4
                    318:  * End:
                    319:  * vim600: sw=4 ts=4 fdm=marker
                    320:  * vim<600: sw=4 ts=4
                    321:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>