📄 db.c
字号:
// prev 及 戚互 cur 及戚卞卅月方丹卞允月 if( prev == -1 ){ // 燮 分匀凶及匹伉件弁反中元日卅中 } else { master_buf[prev].nextind = master_buf[cur].nextind; } // 公木匹愤坌互伉旦玄井日陆木月及匹荸 允月 dbReleaseNode( cur ); log( "find key %s deleted\n", k ); return 0; } prev = cur; cur = master_buf[cur].nextind; } // not found log( "dbExtractNodeBykey: %s not found\n" , k ); return 0;}*/// Spock 2000/10/13static intdbExtractNodeByKey( int dbi , char *k ){ int hashind = tableGetEntry( dbi , k ); if ( hashind < 0 ){ log( "dbExtractNodeByKey: tableGetEntry fail, key:%s\n" , k ); return -1; } if ( dbt[dbi].hashtable[hashind].dbind < 0 ){ log( "dbExtractNodeByKey: invalid dbind in hash, key:%s\n" , k ); return -1; } dbReleaseNode( dbt[dbi].hashtable[hashind].dbind ); tableReleaseNode( dbi , hashind ); return 0;}// Spock end/* Spock deleted 2000/10/12static int dbGetEntryByKey( int topind , char *k ){ int cur = topind; unsigned int h = hashpjw( k ); if( topind == -1 ) return 0; for(;;){ if( cur == -1 )break; if( master_buf[cur].keyhash == h && strcmp( master_buf[cur].key, k ) == 0 ){ return cur; } cur = master_buf[cur].nextind; } return -1;}*//* 伉件弁及玄永皿毛芨尹日木凶日}袄毛 曰卞用□玉毛腹绸仄化 赝濠卅午仇欠卞 Insert 允月[切中今中 井日云云五中 卞卅日氏匹中月午 移烂 *//* Spock deleted 2000/10/13static intdbInsertNodeByIValue( int topind , int ins ){ int cur = topind; int prev = -1; if( topind == -1 ) return -1; for(;;){ if( cur == -1 ){ // 引匹中匀凶及匹馨笛允月 master_buf[prev].nextind = ins; master_buf[ins].nextind = -1; return 0; } if( master_buf[cur].ivalue < master_buf[ins].ivalue ){ if( prev == -1 ){ log( "top_node is badly configured\n" ); return -1; } master_buf[prev].nextind = ins; master_buf[ins].nextind = cur; return 0; } prev = cur; cur = master_buf[cur].nextind; } return -1;}*/// Spock 2000/10/13static intdbInsertNodeByIValue( int topind , int ins ){ int cur = topind; if ( (topind < 0)||(topind >= dbsize)||(ins < 0)||(ins >= dbsize ) ) return -1; while ( master_buf[cur].next >= 0 ){ if ( master_buf[master_buf[cur].next].ivalue < master_buf[ins].ivalue ) break; cur = master_buf[cur].next; } master_buf[ins].prev = cur; master_buf[ins].next = master_buf[cur].next; if ( master_buf[cur].next >= 0 ) master_buf[master_buf[cur].next].prev = ins; master_buf[cur].next = ins; return 0;}// Spock end/* Spock deleted 2000/10/13static intdbAppendNode( int topind , int ins ){ int cur =topind; int prev = -1; if( topind == -1 ) return -1; for(;;){ if( cur == -1 ){ master_buf[prev].nextind = ins; master_buf[ins].nextind = -1; return 0; } prev = cur; cur = master_buf[cur].nextind; } return -1;}*/// Spock 2000/10/13static intdbAppendNode( int topind , int ins ){ if ( (topind < 0)||(topind >= dbsize)||(ins < 0)||(ins >= dbsize ) ) return -1; master_buf[ins].prev = topind; master_buf[ins].next = master_buf[topind].next; if ( master_buf[topind].next >= 0 ) master_buf[master_buf[topind].next].prev = ins; master_buf[topind].next = ins; return 0;}// Spock end/* 犯□正矛□旦及 蟆毛 月[db反醒互剂卅中及匹 骚卞strcmp仄化方中 DBTYPE :潘 [ 云卅元卅引尹及 反}帮醒午 侬 及 卞绣箕允月仇午互匹五月[ */static intdbGetTableIndex( char *tname , DBTYPE type ){ int i; for(i=0;i<MAXTABLE;i++){ if( dbt[i].use && strcmp( dbt[i].name , tname ) == 0 && dbt[i].type == type ){ return i ; } } /* 心勾井日卅井匀凶及匹蕙筋分 */ for(i=0;i<MAXTABLE;i++){ if( dbt[i].use == 0 ){ int topind; dbt[i].use = 1; dbt[i].type = type; snprintf( dbt[i].name , sizeof( dbt[i].name ) , "%s", tname ); // Spock 2000/10/16 if ( reallocHash( i ) < 0 ) { log( "重新分配无用信息失败\n"); return -2; } dbt[i].ent_finder = HASH_PRIME; // Spock end //topind = dbAllocNode( type ); // Spock +1 2000/10/16 topind = dbAllocNode(); if( topind < 0 ){ log( "数据分配节点失败\n" ); return -2; } /* Spock deleted 2000/10/16 snprintf( master_buf[topind].key , sizeof(master_buf[topind].key), "top_node" ); master_buf[topind].keyhash = hashpjw( master_buf[topind].key ); master_buf[topind].nextind = -1; */ /* 玄永皿及用□玉毛赓渝祭允月卅曰[ 侬 及桦宁手帮醒及桦宁手云卅元匹方中[ 0x7fffffff午中丹袄反} 侬 及桦宁反今幻升啦 毛手凶卅中及分[*/ master_buf[topind].ivalue = 0x7fffffff; /* Spock deleted 2000/10/16 if( type == DB_INT_SORTED ){ master_buf[topind].charvalue_index = -1; //dbSetString( master_buf[topind].charvalue_index, "" ); } else { dbSetString( master_buf[topind].charvalue_index, "" ); } */ // Spock 2000/10/16 master_buf[topind].prev = -1; master_buf[topind].next = -1; strcpy( master_buf[topind].key , "top_node" ); master_buf[topind].charvalue[0] = 0; // Spock end dbt[i].toplinkindex = topind; return i; } } /* 互中匀天中分[ */ log( "dbGetTableIndex: table full. now tables are:\n" ); dbShowAllTable(); return -1;}/* 午曰丐尹内 strtol 匹五月袄仄井扔禾□玄仄卅中方 腹绸仄化苇勾仃凶用□玉卞覆仄化} 伉件弁井日 五午匀化井日}漆蘸反末□玄允月及卞银丹袄毛凶方曰卞 腹绸仄化}中中桦赭毛心勾仃凶日}公仇卞犒仄仇戈[ *//* Spock deleted 2000/10/16int dbUpdateEntryInt( char *table , char *key , int value, char *info ){ int r, dbi = dbGetTableIndex( table , DB_INT_SORTED ); int entind; 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( "dbUpdateEntryInt: dbExtractNodeByKey fail! bug!!!!\n" ); return -1; } entind = dbAllocNode(DB_INT_SORTED); if( entind < 0 ) return -1; master_buf[entind].ivalue = value; snprintf( master_buf[entind].key , sizeof(master_buf[entind].key), "%s", key ); master_buf[entind].keyhash = hashpjw( master_buf[entind].key ); master_buf[entind].nextind = -1; // 尥笛树 毛本永玄允月 dbSetString( master_buf[entind].charvalue_index, info ); r = dbInsertNodeByIValue( dbt[dbi].toplinkindex , entind ); if( r < 0 ){ log( "dbUpdateEntryInt: dbInsertNodeByIValue failed\n" ); return -1; } log( "dbUpdateEntryInt: successfully updated entry %s:%s:%d\n", table, key, value ); return 0; }*/// Spock 2000/10/16int dbUpdateEntryInt( char *table , char *key , int value, char *info ){ int dbi = dbGetTableIndex( table , DB_INT_SORTED ); int dbind, hashind, newpos; // Spock 2000/10/23 if ( strlen( key ) >= KEY_MAX ) { log( "dbUpdateEntryInt: key is too long, key:%s\n", key ); return -1; } if ( strlen( info ) >= CHARVALUE_MAX ) { log( "dbUpdateEntryInt: charvalue is too long, charvalue:%s\n", info ); return -1; } // Spock end if ( dbi < 0 ){ log( "dbUpdateEntryInt: dbGetTableIndex fail\n"); return -1; } hashind = tableGetEntry( dbi , key ); if ( hashind < 0 ) { dbind = dbAllocNode(); if ( dbind < 0 ) { log( "dbUpdateEntryInt: dbAllocNode fail\n" ); return -1; } master_buf[dbind].ivalue = value; strcpy( master_buf[dbind].key , key ); strcpy( master_buf[dbind].charvalue , info ); if ( dbInsertNodeByIValue( dbt[dbi].toplinkindex , dbind ) < 0 ) { master_buf[dbind].use = 0; log( "dbUpdateEntryInt: dbInsertNodeByIValue fail\n" ); return -1; } if ( tableInsertNode( dbi , key , dbind ) < 0 ) { dbReleaseNode( dbind ); log( "dbUpdateEntryInt: tableInsertNode fail\n" ); return -1; } } else { dbind = dbt[dbi].hashtable[hashind].dbind; master_buf[dbind].ivalue = value; strcpy( master_buf[dbind].charvalue , info ); newpos = dbind; while ( master_buf[newpos].prev >= 0 ) { if ( value <= master_buf[master_buf[newpos].prev].ivalue ) { break; } newpos = master_buf[newpos].prev; } if ( newpos != dbind ) { master_buf[master_buf[dbind].prev].next = master_buf[dbind].next; if ( master_buf[dbind].next >= 0 ) master_buf[master_buf[dbind].next].prev = master_buf[dbind].prev; master_buf[dbind].prev = master_buf[newpos].prev; master_buf[dbind].next = newpos; if ( master_buf[newpos].prev >= 0 ) master_buf[master_buf[newpos].prev].next = dbind; master_buf[newpos].prev = dbind; dbt[dbi].updated = 1; /* log( "dbUpdateEntryInt: successfully updated entry %s:%s:%d\n", table, key, value ); */ return 0; } while ( master_buf[newpos].next >= 0 ) { if ( value >= master_buf[master_buf[newpos].next].ivalue ) { break; } newpos = master_buf[newpos].next; } if ( newpos != dbind ) { master_buf[master_buf[dbind].prev].next = master_buf[dbind].next; master_buf[master_buf[dbind].next].prev = master_buf[dbind].prev; master_buf[dbind].prev = newpos; master_buf[dbind].next = master_buf[newpos].next; if ( master_buf[newpos].next >= 0 ) master_buf[master_buf[newpos].next].prev = dbind; master_buf[newpos].next = dbind; } } dbt[dbi].updated = 1; /* log( "dbUpdateEntryInt: successfully updated entry %s:%s:%d\n", table, key, value ); */ return 0;}// Spock endintdbDeleteEntryInt( char *table, char *key ){ int dbi = dbGetTableIndex( table , DB_INT_SORTED ); int r; if ( strlen( key ) >= KEY_MAX ) { log( "dbDeleteEntryInt: key is too long, key:%s\n", key ); return -1; } if( dbi < 0 ) { log( "dbDeleteEntryInt: dbGetTableIndex failed for %s\n", table ); return -1; } //r = dbExtractNodeByKey( dbt[dbi].toplinkindex , key ); // Spock fixed 2000/10/19 r = dbExtractNodeByKey( dbi , key ); if( r < 0 ){ log( "dbDeleteEntryInt: dbExtractNodeByKey failed for %s in %s\n", key,table ); return -1; } // Spock +1 2000/10/19 dbt[dbi].updated = 1; log( "deleted key %s from table %s\n", key, table ); return 0;}static voiddbShowAllTable(void){ int i; for(i=0;i<MAXTABLE;i++){ if( dbt[i].use ){ log( "%d Name:%s Use:%d Type:%d\n",i, dbt[i].name , dbt[i].num , dbt[i].type ); } } }/* 犯□正毛1蜊潸曰分允[ */intdbGetEntryInt( char *table, char *key, int *output ){ int dbi = dbGetTableIndex( table , DB_INT_SORTED ); int entind; // Spock +1 2000/10/19 int hashind; // Spock deleted 2000/10/19 //if( strlen(key) >= sizeof( master_buf[entind].key) ) return -1; if( dbi <0 ) { log( "dbGetEntryInt: dbGetTableIndex fail\n" ); return -1; } // Spock 2000/10/19 if( strlen(key) >= KEY_MAX ) { log( "dbGetEntryInt: key is too long, key:%s\n" , key ); return -1; } hashind = tableGetEntry( dbi , key ); if( hashind < 0 ) return -1; entind = dbt[dbi].hashtable[hashind].dbind; //entind = dbGetEntryByKey( dbt[dbi].toplinkindex , key ); // Spock end if( entind < 0 ) { log( "dbGetEntryInt: Invalid dbind in hashtable of %s\n" , table ); return -1; } /* 心勾井匀凶及匹袄毛请 卞 木化忒允 */ *output = master_buf[entind].ivalue; return 0;}/* 巨仿□及桦宁反 [0分匀凶日岳 [ int *rank_out : 仿件弁及请 int *count_out : 晓井日窒蜊 井及请 int 犯□正矛□旦毁迕友 */intdbGetEntryRank( char *table, char *key , int *rank_out, int *count_out){ int dbi = dbGetTableIndex( table , DB_INT_SORTED ); // Spock deleted 2000/10/19 //unsigned int hash = hashpjw(key); int cur; int now_score = 0x7fffffff; /*int 匹中切壬氏匹井中袄 */ int r = -1 , i=0; // Spock 2000/10/23 //if( strlen(key) >= sizeof( master_buf[cur].key) ) return -1; if( strlen(key) >= KEY_MAX ) { log( "dbGetEntryRank: key is too long, key:%s\n" , key ); return -1; } if( dbi <0 ) { log( "dbGetEntryRank: dbGetTableIndex fail\n" ); return -1; } // Spock end // Spock 2000/10/23
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -