📄 db.c
字号:
//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 + -