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

📄 db.c

📁 石器时代8.0服务端完整源代码。可以直接编译
💻 C
📖 第 1 页 / 共 3 页
字号:
            // 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 + -