diff --git a/.gitattributes b/.gitattributes index baf80fbcea108b21b74847a918e6b655265fcc86..0ebdcedaa6dc8f6e70c3783ea787dec6859ba32d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -360,8 +360,6 @@ testfont binary /src/modules/module_configure.in foreign_ident /src/modules/module_makefile foreign_ident /src/modules/spider/Makefile.in foreign_ident -/src/modules/spider/accesseddb.c foreign_ident -/src/modules/spider/accesseddb.h foreign_ident /src/modules/spider/acconfig.h foreign_ident /src/modules/spider/configure.in foreign_ident /src/modules/spider/defs.h foreign_ident diff --git a/src/modules/spider/accesseddb.c b/src/modules/spider/accesseddb.c deleted file mode 100644 index 45ab8a5176fc240f6a0261b8ab57438e1b88d7f6..0000000000000000000000000000000000000000 --- a/src/modules/spider/accesseddb.c +++ /dev/null @@ -1,564 +0,0 @@ -/* - * $Id: accesseddb.c,v 1.18 1999/02/10 21:54:20 hubbe Exp $ - */ - -#include "global.h" - -#include "config.h" - -#include "stralloc.h" -#include "pike_macros.h" -#include "backend.h" -#include "object.h" -#include "constants.h" -#include "interpret.h" -#include "svalue.h" -#include "mapping.h" -#include "array.h" -#include "error.h" -#include "builtin_functions.h" - -RCSID("$Id: accesseddb.c,v 1.18 1999/02/10 21:54:20 hubbe Exp $"); - -#include <stdio.h> - -#ifdef HAVE_SYS_UIO_H -#include <sys/uio.h> -#endif - -#if HAVE_SYS_TIME_H -#include <sys/time.h> -#endif - -#ifdef HAVE_SYS_CONF_H -#include <sys/conf.h> -#endif - -#ifdef HAVE_STROPTS_H -#include <stropts.h> -#endif - -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif - -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif - -#ifdef HAVE_SYS_SOCKIO_H -#include <sys/sockio.h> -#endif - -#ifdef HAVE_ARPA_INET_H -#include <arpa/inet.h> -#endif - -#ifdef HAVE_NETDB_H -#include <netdb.h> -#endif - -#ifdef HAVE_SYS_FILE_H -#include <sys/file.h> -#endif /* HAVE_SYS_FILE_H */ - -#include <sys/stat.h> -#include <fcntl.h> - -#include "dmalloc.h" -#include "accesseddb.h" - -#ifndef SEEK_SET -#ifdef L_SET -#define SEEK_SET L_SET -#else /* !L_SET */ -#define SEEK_SET 0 -#endif /* L_SET */ -#endif /* SEEK_SET */ -#ifndef SEEK_CUR -#ifdef L_INCR -#define SEEK_SET L_INCR -#else /* !L_INCR */ -#define SEEK_CUR 1 -#endif /* L_INCR */ -#endif /* SEEK_CUR */ -#ifndef SEEK_END -#ifdef L_XTND -#define SEEK_END L_XTND -#else /* !L_XTND */ -#define SEEK_END 2 -#endif /* L_XTND */ -#endif /* SEEK_END */ - - -#define COOKIE 0x11223344 -/* Must be (2**n)-1 */ -#define CACHESIZE 2047 - -#define BASE_OFFSET 48 -#define BUFFLEN 8192 -#define FUZZ 60 -#undef THIS -#define THIS ((struct file_head *)(fp->current_storage)) -#define N_SIZE(S) (((MAX((S).len,SHORT_FILE_NAME)+sizeof(struct node)-1)/8+1)*8) -#define HASH(X) MAX(((int)(((X)>>10)^(X))&CACHESIZE)-FUZZ,0) -#define SHORT_FILE_NAME 16 - - -struct string { - unsigned int len; - unsigned int hval; /* Hash value. Used in string comparison */ - char s[1]; /* Expands. MUST BE LAST IN STRUCT */ -}; - -typedef struct node -{ - /* THEESE TWO MUST BE FIRST (optimization in write_entry) */ - INT32 hits; - INT32 mtime; - - unsigned INT32 offset; - INT32 creation_time; - INT32 val1; - INT32 val2; - - struct string name; /* MUST BE LAST */ -} node_t; - - -struct file_head { - unsigned int cookie; - unsigned int creation_time; - unsigned int next_free; - - unsigned int reserved[8]; - /* Not saved */ - int fd, fast_hits, other_hits, cache_conflicts, misses; - char buffer[BUFFLEN]; - unsigned int buffer_inited; - unsigned int bpos; /* Start of the buffer */ - unsigned int pos; /* Current position in file */ - node_t *cache_table[CACHESIZE+1]; -}; - -int mread(struct file_head *this, char *data, int len, int pos) -{ - int buffert_pos = this->pos-this->bpos; - this->pos = pos; - if(this->buffer_inited - && (this->pos>this->bpos) - && (buffert_pos+len<BUFFLEN)) - { - MEMCPY(data, this->buffer+buffert_pos, len); - return len; - } - - this->bpos = this->pos; - lseek(this->fd, this->pos, SEEK_SET); - read(this->fd, this->buffer, BUFFLEN); - this->buffer_inited = 1; - - MEMCPY(data, this->buffer, len); - return len; -} - -void mwrite(struct file_head *this, char *data, int len, int pos) -{ - this->pos = pos; - lseek(this->fd, this->pos, SEEK_SET); - write(this->fd, data, len); -} - -static node_t *entry(int offset, struct file_head *this) -{ - node_t *me = malloc(sizeof(node_t)+63); - - mread(this, (char *)me, sizeof(node_t)+63,offset+BASE_OFFSET); - if(me->name.len > SHORT_FILE_NAME) - { - int wl = sizeof(node_t)+me->name.len; - free(me); - me = malloc(wl); - mread(this,(char *)me,wl,offset+BASE_OFFSET); - } - me->name.s[me->name.len]=0; - return me; -} - -static void save_head( struct file_head *this ) -{ - mwrite(this, (char *)this, 32, 0); -} - -static void load_head( struct file_head *this ) -{ - mread(this, (char *)this, 32, 0); -} - -#ifndef MAX -#define MAX(a,b) ((a)<(b)?(b):(a)) -#endif - -static void write_entry( node_t *e, struct file_head *this, int shortp ) -{ - if(shortp) - mwrite(this,(char*)e,8,e->offset+BASE_OFFSET); - else - mwrite(this,(char*)e,sizeof(node_t)+MAX(e->name.len, SHORT_FILE_NAME)-1, - e->offset+BASE_OFFSET); -} - -static void free_entry( node_t *e ) -{ - free( e ); -} - -void insert_in_cache(node_t *me, struct file_head *this) -{ - int of = HASH(me->name.hval), oof=of; - while(this->cache_table[of]) { - of++; - if(of>CACHESIZE || (of-oof>FUZZ)) - break; - } - if(of<=CACHESIZE && (of-oof)<=FUZZ) - this->cache_table[of]=me; - else { - if(this->cache_table[oof]->hits < me->hits) - { - this->cache_conflicts++; - free_entry(this->cache_table[oof]); - this->cache_table[oof]=me; - } - } -} - - -static node_t *new_entry(struct string *file_name, struct file_head *this) -{ - int entry_size = N_SIZE(*file_name); - node_t *me; - unsigned int pos; - int t = current_time.tv_sec; - - pos = this->next_free; - this->next_free += entry_size; - save_head(this); - - me = malloc(sizeof(node_t)+file_name->len-1+SHORT_FILE_NAME); - me->creation_time = t; - me->hits=0; - me->mtime = t; - MEMCPY(&me->name, file_name, sizeof(string)+file_name->len); - me->offset = pos; - write_entry( me, this, 0 ); - - insert_in_cache(me,this); - return me; -} - -static node_t *slow_find_entry(struct string *name, struct file_head *this) -{ - unsigned int i,j=0; - struct node *me; - - if(!this->next_free) return 0; /* Empty */ - - /* Start with the _next_ entry. */ - i=this->pos?(this->pos-BASE_OFFSET):0; - me=entry(i,this); - i+=N_SIZE(me->name); - if(i>=this->next_free) i=0; - - - /* Loop until found, if found, insert in cache, otherwise, return 0. */ - - while(j<(this->next_free-BASE_OFFSET)) - { - me=entry(i,this); - if((me->name.hval==name->hval) - && (me->name.len==name->len) - && !strncmp(me->name.s, name->s, name->len)) - { - /* MATCH Insert in table */ - insert_in_cache(me,this); - return me; - } - /* Step forward to the next entry */ - - i+=N_SIZE(me->name); - j+=N_SIZE(me->name); - - free_entry(me); - if(i>=this->next_free) i=0; - } - return NULL; -} - -static node_t *fast_find_entry(struct string *name, struct file_head *this) -{ - int of = (HASH(name->hval)), oof; - oof=of; - while(this->cache_table[of]) - { - if((this->cache_table[of]->name.hval == name->hval) - && (name->len==this->cache_table[of]->name.len) - && !strncmp(this->cache_table[of]->name.s, name->s, name->len)) - return this->cache_table[of]; - of++; - if(of>CACHESIZE || (of-oof>FUZZ)) - break; - } - return NULL; -} - - -static node_t *find_entry(struct string *name, struct file_head *this) -{ - struct node *me; - if((me = fast_find_entry( name, this ))) - { - this->fast_hits++; - return me; - } - if((me=slow_find_entry( name, this ))) - { - this->other_hits++; - return me; - } - this->misses++; - return 0; -} - -static struct string *make_string(struct svalue *s) -{ - struct string *res; - if(s->type != T_STRING) return 0; - res = malloc(sizeof(struct string) + s->u.string->len-1); - res->len = s->u.string->len; - MEMCPY(res->s, s->u.string->str, res->len); - res->hval = hashmem((unsigned char *)res->s, (INT32)res->len, - (INT32)res->len); - return res; -} - -static void new_head( struct file_head *this ) -{ - this->cookie = COOKIE; - this->creation_time = current_time.tv_sec; - this->next_free=0; -} - -static void f_create(INT32 args) -{ - if(!args) error("Wrong number of arguments to create(string fname)\n"); - - if(sp[-args].type != T_STRING) - error("Wrong type of argument to create(string fname)\n"); - - THIS->fd = open( (char *)sp[-args].u.string->str, O_RDWR|O_CREAT, 0666 ); - if(THIS->fd < 0) - { - THIS->fd=0; - error("Failed to open db.\n"); - } - load_head( THIS ); - if(!THIS->cookie) - { - new_head( THIS ); - save_head( THIS ); - } else if(THIS->cookie != COOKIE) { - error("Wrong magic cookie. File created on computer with" - " different byteorder?\n"); - close(THIS->fd); - THIS->fd = 0; - THIS->cookie=0; - } -} - - -static void push_entry( node_t *t ) -{ - push_text("hits"); - push_int(t->hits); - - push_text("mtime"); - push_int(t->mtime); - - push_text("creation_time"); - push_int(t->creation_time); - - push_text("value_1"); - push_int(t->val1); - - push_text("value_2"); - push_int(t->val2); - - f_aggregate_mapping(10); -} - -static void f_add( INT32 args ) -{ - node_t *me; - int modified = 0; - struct string *s; - - if(!THIS->fd) error("No open accessdb.\n"); - - if(args<2) error("Wrong number of arguments to add(string fname,int num[, int arg1, int arg2])\n"); - - if(!(s=make_string(sp-args))) - error("Wrong type of argument to add(string fname,int num)\n"); - - if(!(me = find_entry( s, THIS ))) me=new_entry( s, THIS ); - if(!me) error("Failed to create entry.\n"); - - if(sp[-1].u.integer) - { - me->hits += sp[-1].u.integer; - me->mtime = current_time.tv_sec; - modified=1; - } - if(args>2) - { - me->val1 = sp[-args+2].u.integer; - if(args>3) - me->val2 = sp[-args+3].u.integer; - me->mtime = current_time.tv_sec; - write_entry( me, THIS, 0); - } else if(modified) - write_entry( me, THIS, 1); - - pop_n_elems( args ); - push_entry( me ); - free(s); -} - -static void f_set( INT32 args ) -{ - node_t *me; - int modified = 0; - struct string *s; - - if(!THIS->fd) error("No open accessdb.\n"); - - if(args<2) error("Wrong number of arguments to set(string fname,int num[, int arg1, int arg2])\n"); - - if(!(s=make_string(sp-args))) - error("Wrong type of argument to set(string fname,int num,...)\n"); - - if(!(me = find_entry( s, THIS ))) me=new_entry( s, THIS ); - if(!me) error("Failed to create entry.\n"); - - if(sp[-1].u.integer) - { - me->hits = sp[-1].u.integer; - me->mtime = current_time.tv_sec; - modified=1; - } - if(args>2) - { - me->val1 = sp[-args+2].u.integer; - if(args>3) - me->val2 = sp[-args+3].u.integer; - write_entry( me, THIS, 0); - } else if(modified) - write_entry( me, THIS, 1); - - pop_n_elems( args ); - push_entry( me ); - free(s); -} - - -static void f_new( INT32 args ) -{ - node_t *me; - struct string *s; - - if(!THIS->fd) error("No open accessdb.\n"); - - if(args<2) error("Wrong number of arguments to new(string fname,int num[, int val1, int val2])\n"); - - if(!(s=make_string(sp-args))) - error("Wrong type of argument to new(string fname,int num[, int val1, int val2])\n"); - - me=new_entry( s, THIS ); - if(!me) error("Failed to create entry.\n"); - - if(sp[-1].u.integer) - { - me->hits = sp[-args+1].u.integer; - me->mtime = current_time.tv_sec; - if(args>2) - { - me->val1 = sp[-args+2].u.integer; - if(args>3) - me->val2 = sp[-args+3].u.integer; - write_entry( me, THIS, 0); - } else - write_entry( me, THIS, 1); - } - pop_n_elems( args ); - push_entry( me ); - free(s); -} - - -static void f_debug( INT32 args ) -{ - push_text("cachehits"); - push_int( THIS->fast_hits ); - push_text("slowhits"); - push_int( THIS->other_hits ); - push_text("misses"); - push_int( THIS->misses ); - push_text("conflicts"); - push_int( THIS->cache_conflicts ); - THIS->fast_hits=0; - THIS->other_hits=0; - THIS->misses=0; - THIS->cache_conflicts=0; - pop_n_elems(args); - f_aggregate_mapping( 8 ); -} - -static void init_file_head(struct object *o) -{ - MEMSET(THIS, 0, sizeof(struct file_head)); -} - -static void free_file_head(struct object *o) -{ - int i; - if(THIS->fd) close(THIS->fd); - for(i=0; i<CACHESIZE; i++) - if(THIS->cache_table[i]) - free_entry(THIS->cache_table[i]); -} - -void init_accessdb_program(void) -{ - start_new_program(); - ADD_STORAGE(struct file_head); - /* function(string:void) */ - ADD_FUNCTION("create", f_create,tFunc(tStr,tVoid), ID_PUBLIC); - /* function(string,int ...:mapping(string:int)) */ - ADD_FUNCTION("add", f_add,tFuncV(tStr,tInt,tMap(tStr,tInt)), - ID_PUBLIC); - /* function(string,int ...:mapping(string:int)) */ - ADD_FUNCTION("set", f_set,tFuncV(tStr,tInt,tMap(tStr,tInt)), - ID_PUBLIC); - /* function(string,int ...:mapping(string:int)) */ - ADD_FUNCTION("new", f_new,tFuncV(tStr,tInt,tMap(tStr,tInt)), - ID_PUBLIC); - /* function(void:mapping) */ - ADD_FUNCTION("debug", f_debug,tFunc(tVoid,tMapping), ID_PUBLIC); - set_init_callback(init_file_head); - set_exit_callback(free_file_head); - end_class("accessdb",0); -} - -void exit_accessdb_program(void) -{ -} diff --git a/src/modules/spider/accesseddb.h b/src/modules/spider/accesseddb.h deleted file mode 100644 index 388c643e44ed5d3757fb3b1866866ba3894b1ba1..0000000000000000000000000000000000000000 --- a/src/modules/spider/accesseddb.h +++ /dev/null @@ -1,12 +0,0 @@ -/* - * $Id: accesseddb.h,v 1.1 1997/05/18 22:43:18 grubba Exp $ - * - * Prototypes for accesseddb.c - */ - -#ifndef PIKE_ACCESSEDDB_H -#define PIKE_ACCESSEDDB_H - -void init_accessdb_program(void); - -#endif /* PIKE_ACCESSEDDB_H */