Changeset 6681

Show
Ignore:
Timestamp:
30/07/10 16:11:07 (6 weeks ago)
Author:
westram
Message:
  • added GB_key_2_existing_quark (like GB_key_2_quark, but returns 0 for non-existing quarks)
  • use GB_key_2_existing_quark in gb_delete_main_entry (avoid creating GB_SYSTEM_FOLDER after failed client connect). This fixes crash of arb_message when no server was running! (introduced in [6648])
  • gb_pre_delete_entry
    • if no remote_hash exists, do not erase anything from there
  • rewrote GB_key_2_quark() and gb_key_2_quark() using gb_key_2_existing_quark()
Location:
trunk/ARBDB
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • trunk/ARBDB/ad_core.cxx

    r6664 r6681  
    459459     */ 
    460460    if (!Main->local_mode && gbd->server_id) { 
    461         GBS_write_numhash(Main->remote_hash, gbd->server_id, 0); 
     461        if (Main->remote_hash) GBS_write_numhash(Main->remote_hash, gbd->server_id, 0); 
    462462    } 
    463463 
     
    521521    gb_assert(GB_TYPE(gb_main) == GB_DB); 
    522522 
    523     GBQUARK sys_quark = GB_key_2_quark((GBDATA*)gb_main, GB_SYSTEM_FOLDER); 
     523    GBQUARK sys_quark = gb_key_2_existing_quark(GB_MAIN((GBDATA*)gb_main), GB_SYSTEM_FOLDER); 
     524 
     525    // Note: sys_quark may be 0 (happens when destroying client db which never established a connection). 
     526    // In this case no system folder/quark has been created (and we do no longer try to create it) 
     527    // Nothing will happen in pass 2 below. 
    524528 
    525529    for (int pass = 1; pass <= 2; pass++) { 
  • trunk/ARBDB/ad_load.cxx

    r6678 r6681  
    14641464    ASSERT_RESULT(long, gb_create_key(Main, "main", false), 0); 
    14651465 
    1466     Main->dummy_father            = gb_make_container(NULL, 0, -1, 0); // create "main" 
     1466    Main->dummy_father            = gb_make_container(NULL, NULL, -1, 0); // create "main" 
    14671467    Main->dummy_father->main_idx  = gb_make_main_idx(Main); 
    14681468    Main->dummy_father->server_id = GBTUM_MAGIC_NUMBER; 
    1469     gbd                           = gb_make_container(Main->dummy_father, 0, -1, 0); // create "main" 
     1469    gbd                           = gb_make_container(Main->dummy_father, NULL, -1, 0); // create "main" 
    14701470 
    14711471    Main->data = gbd; 
  • trunk/ARBDB/ad_prot.h

    r6678 r6681  
    296296char *GB_read_key(GBDATA *gbd); 
    297297GB_CSTR GB_read_key_pntr(GBDATA *gbd); 
    298 GBQUARK GB_key_2_quark(GBDATA *gbd, const char *s); 
     298GBQUARK GB_key_2_quark(GBDATA *gbd, const char *key); 
    299299GBQUARK GB_get_quark(GBDATA *gbd); 
    300300bool GB_has_key(GBDATA *gbd, const char *key); 
  • trunk/ARBDB/arbdb.cxx

    r6667 r6681  
    12441244 
    12451245 
    1246 GBQUARK GB_key_2_quark(GBDATA *gbd, const char *s) { 
    1247     long          index; 
    1248     GB_MAIN_TYPE *Main = GB_MAIN(gbd); 
    1249  
    1250     if (!s) return -1; 
    1251     index = GBS_read_hash(Main->key_2_index_hash, s); 
    1252     if (!index) {   // create new index 
    1253         index = gb_create_key(Main, s, true); 
    1254     } 
    1255     return (GBQUARK)index; 
    1256 } 
     1246GBQUARK gb_key_2_existing_quark(GB_MAIN_TYPE *Main, const char *key) { 
     1247    /*! @return existing quark for 'key' 
     1248     *          -1 = key is NULL 
     1249     *           0 = no quark exists 
     1250     *        else = quark 
     1251     */ 
     1252 
     1253    GBQUARK quark  = -1; 
     1254    if (key) quark = GBS_read_hash(Main->key_2_index_hash, key); 
     1255    return quark; 
     1256} 
     1257 
     1258GBQUARK GB_key_2_quark(GBDATA *gbd, const char *key) { 
     1259    /*! find or create quark for 'key' 
     1260     * @return -1 if key is NULL, else existing or created quark 
     1261     */ 
     1262 
     1263    GB_MAIN_TYPE *Main  = GB_MAIN(gbd); 
     1264    GBQUARK       quark = gb_key_2_existing_quark(Main, key); 
     1265    if (!quark) quark   = gb_create_key(GB_MAIN(gbd), key, true); 
     1266    return quark; 
     1267} 
     1268 
     1269#if defined(DEVEL_RALF) 
     1270#warning add gb_NULLkey_2_quark allowing NULL as key 
     1271#endif // DEVEL_RALF 
     1272 
     1273GBQUARK gb_key_2_quark(GB_MAIN_TYPE *Main, const char *key) { 
     1274    // similar to GB_key_2_quark,  
     1275    // but if 'key' is NULL, quark 0 will be returned. 
     1276    //  
     1277    // Use this function with care. 
     1278    // 
     1279    // Known good use: 
     1280    // - create main entry and its dummy father via gb_make_container() 
     1281    // 
     1282    // Other uses (maybe just to pass GB_MAIN_TYPE instead of GBDATA as GB_key_2_quark likes): 
     1283    // - gb_rename_entry 
     1284    // - gb_make_entry 
     1285    // - compress_sequence_tree 
     1286    // - dictionary compression (several calls) 
     1287 
     1288    GBQUARK quark = 0; 
     1289    if (key) { 
     1290        quark             = gb_key_2_existing_quark(Main, key); 
     1291        if (!quark) quark = gb_create_key(Main, key, true); 
     1292        gb_assert(quark>0); 
     1293    } 
     1294    return quark; 
     1295} 
     1296 
     1297// --------------------------------------------- 
    12571298 
    12581299GBQUARK GB_get_quark(GBDATA *gbd) { 
     
    12651306} 
    12661307 
    1267 GBQUARK gb_key_2_quark(GB_MAIN_TYPE *Main, const char *s) { 
    1268     long index; 
    1269     if (!s) return 0; 
    1270     index = GBS_read_hash(Main->key_2_index_hash, s); 
    1271     if (!index) {   // create new index 
    1272         index = gb_create_key(Main, s, true); 
    1273     } 
    1274     return (GBQUARK)index; 
    1275 } 
    1276  
    1277  
    1278  
    1279  
    1280 long GB_read_clock(GBDATA *gbd) 
    1281 { 
     1308// --------------------------------------------- 
     1309 
     1310long GB_read_clock(GBDATA *gbd) { 
    12821311    if (GB_ARRAY_FLAGS(gbd).changed) return GB_MAIN(gbd)->clock; 
    12831312    return GB_GET_EXT_UPDATE_DATE(gbd); 
    12841313} 
    12851314 
    1286 long    GB_read_transaction(GBDATA *gbd) 
    1287 { 
     1315long GB_read_transaction(GBDATA *gbd) { 
    12881316    return GB_MAIN(gbd)->transaction; 
    12891317} 
  • trunk/ARBDB/gb_prot.h

    r6661 r6681  
    123123GB_ERROR gb_security_error(GBDATA *gbd) __ATTR__USERESULT; 
    124124GB_CSTR gb_read_key_pntr(GBDATA *gbd); 
    125 GBQUARK gb_key_2_quark(GB_MAIN_TYPE *Main, const char *s); 
     125GBQUARK gb_key_2_existing_quark(GB_MAIN_TYPE *Main, const char *key); 
     126GBQUARK gb_key_2_quark(GB_MAIN_TYPE *Main, const char *key); 
    126127GBDATA *gb_create(GBDATA *father, const char *key, GB_TYPES type); 
    127128GBDATA *gb_create_container(GBDATA *father, const char *key);