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; }
//对比两个数据表格,找出差异,然后找出差异的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; }
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; }