Beispiel #1
0
static int fromtext(arp_array_e type, const char *value) {
	const pair_array_t *array = select_array(type);
	const pair_t *result = pair_array_lookup_value(array, value);
	return result == NULL ? pair_array_last(array)->key : result->key;
}
Beispiel #2
0
//对比两个数据表格,找出差异,然后找出差异的SQL
int ZCE_General_Config_Table::compare_table(const char *old_db,
                                            const char *new_db,
                                            unsigned int table_id,
                                            std::string *update_sql)
{
    int ret = 0;



    //读取旧数据
    ret = open_dbfile(old_db, true , false);
    if (0 != ret)
    {
        return ret;
    }
    ARRARY_OF_AI_IIJIMA_BINARY old_ai_iijma;
    ret = select_array(table_id,
                       0,
                       0,
                       &old_ai_iijma);
    if (0 != ret)
    {
        return ret;
    }

    //读取新数据
    ret = open_dbfile(new_db, true, false);
    if (0 != ret)
    {
        return ret;
    }
    ARRARY_OF_AI_IIJIMA_BINARY new_ai_iijma;
    ret = select_array(table_id,
                       0,
                       0,
                       &new_ai_iijma);
    if (0 != ret)
    {
        return ret;
    }

    //把新旧数据排序,方便比较
    std::sort(old_ai_iijma.begin(), old_ai_iijma.end());
    std::sort(new_ai_iijma.begin(), new_ai_iijma.end());

    update_sql->reserve(MAX_SQLSTRING_LEN);

    //两个都有序,找出差异的元素
    size_t p = 0, q = 0;
    for (; p < old_ai_iijma.size();)
    {
        //如果对比的两者相等
        if (old_ai_iijma[p].index_1_ == new_ai_iijma[q].index_1_ &&
            old_ai_iijma[p].index_2_ == new_ai_iijma[q].index_2_)
        {
            if (old_ai_iijma[p].ai_data_length_ == new_ai_iijma[q].ai_data_length_ &&
                0 == ::memcmp(old_ai_iijma[p].ai_iijima_data_,
                              new_ai_iijma[q].ai_iijima_data_,
                              old_ai_iijma[p].ai_data_length_))
            {
                //old[p] = new[q]相同,
                ++p;
                ++q;
            }
            else
            {
                //old[p] != new[q],对比的记录不相同,REPLACE
                sql_replace_one(table_id,
                                new_ai_iijma[q].index_1_,
                                new_ai_iijma[q].index_2_,
                                new_ai_iijma[q].ai_data_length_,
                                new_ai_iijma[q].ai_iijima_data_,
                                new_ai_iijma[q].last_mod_time_);
                *update_sql += sql_string_;

                ++p;
                ++q;
            }

        }
        //继续在 new 里面寻找 old[p]
        else
        {
            size_t r = q++;
            for (; r < new_ai_iijma.size();)
            {
                if (old_ai_iijma[p].index_1_ == new_ai_iijma[r].index_1_ &&
                    old_ai_iijma[p].index_2_ == new_ai_iijma[r].index_2_)
                {
                    bool r_is_equal = false;
                    if (old_ai_iijma[p].ai_data_length_ == new_ai_iijma[r].ai_data_length_ &&
                        0 == ::memcmp(old_ai_iijma[p].ai_iijima_data_,
                                      new_ai_iijma[r].ai_iijima_data_,
                                      old_ai_iijma[p].ai_data_length_))
                    {
                        r_is_equal = true;
                    }

                    //index相同的位置的数据是否一致的,决定这个位置是否更新
                    size_t end_pos = r_is_equal ? r - 1 : r;
                    for (size_t s = q; s < end_pos; ++s)
                    {
                        //new[q] 到 new[r] 都是新赠的,REPLACE
                        sql_replace_one(table_id,
                                        new_ai_iijma[s].index_1_,
                                        new_ai_iijma[s].index_2_,
                                        new_ai_iijma[s].ai_data_length_,
                                        new_ai_iijma[s].ai_iijima_data_,
                                        new_ai_iijma[s].last_mod_time_);
                        *update_sql += sql_string_;
                    }

                    break;

                }
            }

            if (r < new_ai_iijma.size())
            {
                ++p;
                q = r++;
            }
            //old[p] 是多出的,DELETE
            else
            {
                sql_delete_one(table_id, old_ai_iijma[p].index_1_, old_ai_iijma[p].index_2_);
                *update_sql += sql_string_;
                ++p;
            }
        }

    }

    //如果new[q] 不是 最后一个节点,那么new[q]到尾部都是新增的数据 REPLACE
    for (; q < new_ai_iijma.size(); ++q)
    {
        //new[q] 到 new[r] 都是新赠的,REPLACE
        sql_replace_one(table_id,
                        new_ai_iijma[q].index_1_,
                        new_ai_iijma[q].index_2_,
                        new_ai_iijma[q].ai_data_length_,
                        new_ai_iijma[q].ai_iijima_data_,
                        new_ai_iijma[q].last_mod_time_);
        *update_sql += sql_string_;
    }

    return 0;
}
Beispiel #3
0
static const char *totext(arp_array_e type, int key) {
	const pair_array_t *array = select_array(type);
	const pair_t *result = pair_array_lookup_key(array, key);
	return result == NULL ? pair_array_last(array)->value : result->value;
}