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

📄 db.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 3 页
字号:
    //cur = master_buf[dbt[dbi].toplinkindex].nextind;    cur = master_buf[dbt[dbi].toplinkindex].next;    //i=0;    //for(;;){    //    if( cur == -1 )break;    while ( cur >= 0 )    {    // Spock end        if( master_buf[cur].ivalue != now_score ){            r=i;            now_score = master_buf[cur].ivalue;        }        // Spock 2000/10/19        //if( hash == master_buf[cur].keyhash &&        //    strcmp( master_buf[cur].key, key )== 0 ){        if( strcmp( master_buf[cur].key , key ) == 0 )        {        // Spock end            *rank_out = r;            *count_out = i;            return 0;        }        //cur = master_buf[cur].nextind;        // Spock fixed 2000/10/19        cur = master_buf[cur].next;        i++;    }    *count_out = i;    *rank_out = r;    return 0;}/*  int 毁迕友 */intdbGetEntryRankRange( char *table,                     int start, int end, char *output, int outlen ){#define MAXHITS 1024        /* 赝癫支卅丐[匹手仇木匹蜗坌日仄中冗 ringo */    struct hitent{          /* 仇及厌瞻  卞甲永玄仄凶支勾毛凶户化中仁 */        int entind;        int rank;    };    int r=0;    struct hitent hits[MAXHITS];    int dbi = dbGetTableIndex( table , DB_INT_SORTED );    int cur;    int hitsuse = 0,i;    int now_score = 0x7fffffff;    if( dbi <0 ) return -1;    if( outlen <= 0 )return -1;        cur = dbt[dbi].toplinkindex;    // Spock 2000/10/23    //for(;;){    //    if( cur == -1 )break;    while ( cur >= 0 )    {    // Spock end        if( master_buf[cur].ivalue != now_score ){            r++;            now_score = master_buf[cur].ivalue;        }        if( r >= start && r <= end ){            hits[hitsuse].entind = cur;            hits[hitsuse].rank = r;            hitsuse++;            //if( hitsuse == MAXHITS )break;            // Spock fixed 2000/10/23            if( hitsuse >= MAXHITS ) break;        }        //cur = master_buf[cur].nextind;        // Spock fixed 2000/10/19        cur = master_buf[cur].next;    }    output[0] = 0;        for(i=0;i<hitsuse;i++){        char tmp[1024];        snprintf( tmp, sizeof(tmp),                  "%d,%s,%d,%s", hits[i].rank, master_buf[hits[i].entind].key,                  master_buf[hits[i].entind].ivalue,	//		            dbGetString( master_buf[i].charvalue_index ));	// Spock fixed 2000/10/19		  master_buf[hits[i].entind].charvalue );        strcatsafe( output, outlen, tmp );        if( i != ( hitsuse -1 ) ){            strcatsafe( output, outlen, "|" );        }    }    return 0;}intdbFlush( char *dir ){    int i;    for(i=0;i<MAXTABLE;i++){        FILE *fp;        char filename[1024];        int entind;        //int j;        if( !dbt[i].use ) continue;        // Spock 2000/10/23        if( dbt[i].updated == 0 )        {            log( "dbFlush: table %s not updated\n" , dbt[i].name );            continue;        }        // Spock end        if( dbt[i].type == DB_INT_SORTED ){            snprintf( filename, sizeof(filename),                      "%s/int/%s", dir, dbt[i].name );        } else {            snprintf( filename, sizeof( filename),                      "%s/string/%s", dir, dbt[i].name );        }                fp = fopen( filename, "w" );        if( fp == NULL ){            log( "cannot open file: %s %s\n",                     filename, strerror( errno ));            continue;        }        // Spock 2000/10/19        //entind = master_buf[dbt[i].toplinkindex].nextind;        entind = master_buf[dbt[i].toplinkindex].next;        //for(j=0;;j++){        //    if( entind == -1 )break;        while ( entind >= 0 )        {        // Spock end            if( dbt[i].type == DB_INT_SORTED ){                fprintf( fp , "%s %d %s\n", master_buf[entind].key,                         master_buf[entind].ivalue,                         //makeStringFromEscaped(                         //    dbGetString(master_buf[entind].charvalue_index)));                         // Spock fixed 2000/10/19                         makeStringFromEscaped(master_buf[entind].charvalue));            } else {                fprintf( fp , "%s %s\n", master_buf[entind].key,                         //makeStringFromEscaped(                         //    dbGetString(master_buf[entind].charvalue_index)));                         // Spock fixed 2000/10/19                         makeStringFromEscaped(master_buf[entind].charvalue));            }            //entind = master_buf[entind].nextind;            // Spock fixed 2000/10/19            entind = master_buf[entind].next;        }        fclose(fp);        dbt[i].updated = 0;    }    return 0;}int dbRead( char *dir ){    char dirname[1024];    DIR *d;    struct dirent *de;    // Spock +1 2000/10/19    memset( dbt , 0 , MAXTABLE * sizeof(struct table) );    {        char tmp[1024];        snprintf( tmp, sizeof( tmp ), "%s/int" , dir );        if( mkdir( tmp, 0755 )==0){            log( "创建 %s\n", tmp );        }        snprintf( tmp, sizeof( tmp ), "%s/string" , dir );        if( mkdir( tmp, 0755 )==0){            log( "创建 %s\n", tmp );        }            }            snprintf( dirname, sizeof( dirname ),              "%s/int" , dir );    d = opendir(dirname);    if( d == NULL ){        log( "不能打开文件 %s\n", dirname );        return -1;    }    while(1){        de = readdir( d );        if( de == NULL )break;        if( de->d_name[0] != '.' ){            char filename[1024];            FILE *fp;            struct stat s;            snprintf( filename, sizeof(filename),"%s/%s",dirname, de->d_name );			log( "读取数据:%s\n..", filename);            if( stat( filename, &s ) < 0 ){                continue;            }            if( !( s.st_mode & S_IFREG ) ){                continue;            }                        fp = fopen( filename, "r" );                        if( fp == NULL ){                log( "不能打开文件 %s %s\n",                         filename, strerror( errno ));                continue;            }            while(1){                char line[1024];                char k[1024] , v[1024], info[1024];                if( fgets( line , sizeof( line) , fp ) == NULL )break;                chop( line);				k[0] = '\0';                easyGetTokenFromString( line, 1, k, sizeof(k));				v[0] = '\0';                easyGetTokenFromString( line, 2, v, sizeof(v));                info[0] = '\0';                easyGetTokenFromString( line, 3, info, sizeof(info));                dbUpdateEntryInt( de->d_name, k, atoi(v), info);            }            fclose(fp);        }    }    closedir(d);    snprintf( dirname, sizeof( dirname), "%s/string" , dir );    d = opendir( dirname );    if( d == NULL ){        log( "不能打开文件 %s\n", dirname );        return -1;    }    while(1){        de = readdir( d );        if( de == NULL )break;        if( de->d_name[0] != '.' ){            char filename[1024];            FILE *fp;            struct stat s;            snprintf( filename, sizeof( filename),"%s/%s",dirname,de->d_name );			log( "读取数据:%s\n..", filename);            if( stat( filename, &s ) < 0 ){                continue;            }            if( !(s.st_mode & S_IFREG )){                continue;            }            fp = fopen( filename, "r" );            if( fp == NULL ){                log( "不能打开文件 %s %s\n",                     filename, strerror(errno ));                continue;            }            while(1){                char line[CHARVALUE_MAX+1024];                     char k[1024];                if( fgets( line, sizeof( line), fp ) == NULL )break;                /* chop */                chop(line);				k[0] = '\0';                easyGetTokenFromString( line, 1, k,sizeof(k));                dbUpdateEntryString( de->d_name, k, line+strlen(k)+1);            }            // Nuke +1 1027: Close for safe            fclose(fp);         }    }    closedir(d);    return 0;}/* 隙烂仄凶匏  井日隙烂仄凶蜊醒潸曰分允[ 撩  仄凶日  }岳  仄凶日0[岳  仄化手坞及请  及午五互丐月冗[   “num互0及午五午井}竟癫允月巨件玄伉互卅中午五[ int 犯□正矛□旦毁迕分冗 */int dbGetEntryCountRange( char *table, int count_start, int  num,                      char *output, int outlen ){    int dbi = dbGetTableIndex( table , DB_INT_SORTED );    int cur;    int i;    int now_score = 0x7fffffff , r;    if( dbi < 0) return -1;    if( outlen < 1 ) return -1;    output[0]=0;    //cur = master_buf[dbt[dbi].toplinkindex].nextind;    // Spock fixed 2000/10/19    cur = master_buf[dbt[dbi].toplinkindex].next;    i=0;    r=0;    for(;;){        if( cur == -1 ) break;        if( master_buf[cur].ivalue != now_score ){            r=i;            now_score = master_buf[cur].ivalue;        }        if( ( i >= count_start ) &&            ( i < (count_start + num ) ) ){            char tmp[1024];                        if( (i !=count_start)){                strcatsafe( output, outlen, "|" );            }                           snprintf( tmp, sizeof( tmp),                      "%d,%d,%s,%d,%s", i, r, master_buf[cur].key,                      master_buf[cur].ivalue,			            //dbGetString( master_buf[cur].charvalue_index ));		      // Spock fixed 2000/10/19		      master_buf[cur].charvalue);            strcatsafe( output, outlen,tmp );        }        i++;        //cur = master_buf[cur].nextind;        // Spock fixed 2000/10/19        cur = master_buf[cur].next;    }    return 0;}/*    侬  犯□正矛□旦及质   *//* Spock deleted 2000/10/19intdbUpdateEntryString( char *table, char *key, char *value ){    int dbi = dbGetTableIndex(table, DB_STRING);    int r, entind;        log( "dbUpdateEntryString: [%s] [%s] [%s]\n", table, key, value );        if( strlen(key) >= sizeof(master_buf[0].key) )return -1;    if( dbi < 0 )return -1;    r = dbExtractNodeByKey( dbt[dbi].toplinkindex, key );    if( r< 0 ){        log( "dbUpdateEntryString dbExtractNodeByKey fail! bug!!\n" );        return -1;    }    entind = dbAllocNode( DB_STRING );    if( entind < 0 ) return -1;    master_buf[entind].ivalue = 0;    dbSetString( master_buf[entind].charvalue_index, value );    snprintf( master_buf[entind].key,              sizeof(master_buf[0].key), "%s",key );    master_buf[entind].keyhash = hashpjw( master_buf[entind].key );    master_buf[entind].nextind = -1;    if(  dbAppendNode( dbt[dbi].toplinkindex, entind ) < 0 ){        log( "dbUpdateEntryString: dbAppendNode failed\n" );        return -1;    }    log( "dbUpdateEntryString: successfully updated entry %s:%s:%s\n",         table,key,value );    return 0;}*/// Spock 2000/10/19int dbUpdateEntryString( char *table, char *key, char *value ){    int dbi = dbGetTableIndex( table , DB_STRING );    int dbind, hashind;    if ( strlen( key ) >= KEY_MAX ) {    	log( "dbUpdateEntryString: key is too long, key:%s\n", key );    	return -1;    }    if ( strlen( value ) >= CHARVALUE_MAX ) {    	log( "dbUpdateEntryString: charvalue is too long, charvalue:%s\n", value );    	return -1;    }    if ( dbi < 0 ) {    	log( "dbUpdateEntryString: dbGetTableIndex fail, table:%s\n", table );    	return -1;    }    hashind = tableGetEntry( dbi , key );    if ( hashind < 0 )    {    	dbind = dbAllocNode();    	if ( dbind < 0 )    	{    	    log( "dbUpdateEntryString: dbAllocNode fail\n" );    	    return -1;    	}    	strcpy( master_buf[dbind].key , key );    	strcpy( master_buf[dbind].charvalue , value );    	if ( dbAppendNode( dbt[dbi].toplinkindex , dbind ) < 0 )    	{    	    master_buf[dbind].use = 0;    	    log( "dbUpdateEntryString: dbAppendNode fail\n" );    	    return -1;    	}    	if ( tableInsertNode( dbi , key , dbind ) < 0 )    	{    	    dbReleaseNode( dbind );	    log( "dbUpdateEntryString: tableInsertNode fail\n" );	    return -1;	}    }    else    {    	dbind = dbt[dbi].hashtable[hashind].dbind;    	strcpy( master_buf[dbind].charvalue , value );    }    dbt[dbi].updated = 1;	/*    log( "dbUpdateEntryString: successfully updated entry %s:%s:%s\n",         table,key,value );		 */    return 0;}// Spock endintdbGetEntryString( char *table, char *key, char *output, int outlen ){    int dbi = dbGetTableIndex( table, DB_STRING );    int entind;    // Spock +1 2000/10/19    int hashind;    // Spock 2000/10/23    //if( strlen(key) >= sizeof( master_buf[entind].key) ) return -1;    if ( strlen(key) >= KEY_MAX ) {    	log( "dbGetEntryString: key is too long, key:%s\n", key );    	return -1;    }    if( dbi <0 ) {    	log( "dbGetEntryString: dbGetTableIndex fail\n" );    	return -1;    }    // Spock 2000/10/19    hashind = tableGetEntry( dbi , key );    if ( hashind < 0 ){		log("err hashind <0\n")		return -1;	}    entind = dbt[dbi].hashtable[hashind].dbind;    if ( entind < 0 ){		log( "entind < 0 ");		return -1;	}    snprintf( output , outlen , "%s" , master_buf[entind].charvalue );    return 0;}intdbDeleteEntryString( char *table, char *key ){    int dbi = dbGetTableIndex( table, DB_STRING );    int r;    // Spock 2000/10/23    //if( strlen(key) >= sizeof( master_buf[entind].key) ) return -1;    if ( strlen(key) >= KEY_MAX ) {    	log( "dbDeleteEntryString: key is too long, key:%s\n", key );    	return -1;    }    if( dbi <0 ) {    	log( "dbDeleteEntryString: dbGetTableIndex fail\n" );    	return -1;    }    // Spock end    //r = dbExtractNodeByKey( dbt[dbi].toplinkindex, key );    // Spock fixed 2000/10/19    r = dbExtractNodeByKey( dbi , key );    if( r < 0 ){        log( "dbDeleteEntryString: dbExtractNodeByKey failed for %s in %s\n",             key,table );        return -1;    }    dbt[dbi].updated = 1;    log( "deleted key %s from table %s\n", key, table );    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -