pechkin: (Default)
pechkin ([personal profile] pechkin) wrote2005-01-23 03:40 pm

Тазом чувствую, что что-то неправильно, а что -- понять не могу:



void __fastcall MergeDataSets(TOAClientDataSet* cdsDst, TOAClientDataSet* cdsSrc, std::vector<const char*>& KeyFieldNames, std::vector<const char*>& CopyFieldNames)
{
  //собираю ключи, которые уже есть в датасете назначения
  std::set<std::vector<AnsiString> > existing_keys;
  for (cdsDst->First(); !cdsDst->Eof; cdsDst->Next())
    existing_keys.insert(CreateKeyVector(cdsDst, KeyFieldNames)); //функцию смотри ниже

  for (cdsSrc->First(); !cdsSrc->Eof; cdsSrc->Next())
  {
    //проверяю, что ключ из второго датасета не встречается в первом
    std::vector key = CreateKeyVector(cdsSrc, KeyFieldNames);
    if (existing_keys.find(key) == existing_keys.end())
    {
      //копирую из второго в первый
      //...


      existing_keys.insert(key);
    }
  }
  while (!existing_keys.empty())
  {
    //как бы, наверно, надо зачистить память, да?
    existing_keys.begin()->clear();
    existing_keys.erase(existing_keys.begin());
  }
}

Ключ -- это вектор, строящийся из строчных представлений значений полей, имена которых перечислены в векторе KeyFieldNames, порядок, естественно, важен.

std::vector __fastcall TfrmVersion::CreateKeyVector(TOAClientDataSet* cds, std::vector<const char*>& KeyFieldNames)
{
  unsigned key_length = KeyFieldNames.size();
  std::vector<AnsiString> key;
  for (unsigned i = 0; i < key_length; i++)
    key.push_back(cds->FieldByName(KeyFieldNames[i])->AsString);
  return key;
}

И вот подсказывает мне мой таз, что то ли память не зачищается где-то, то ли наоборот, объект удалится раньше, чем ссылки перестанут быть нужны.

[identity profile] cryinstone.livejournal.com 2005-01-23 01:15 pm (UTC)(link)
Да, я как-то пропустил что vector от AnsiString, a не от char. Тогда должно быть хоккей. Все равно стоит проверить, как это дело работает.

А насчет (4) - я до сегодняшнего дня думал, что больше компилятору моего визуального восприятия никогда не предстанет токен TOAClientDataSet !!! :)))

[identity profile] ex-reaumur80.livejournal.com 2005-01-23 01:22 pm (UTC)(link)
Это что-то сакральное, TOA... (не произнося всуне)?

Вообще говоря, на множествах у нас есть стандартные операции типа set_union, set_intersection etc. Раз уж танцуем в сторону красивого кода, надо б о них подумать. Добавить генератор, построить два множества, и их объединить. Кррррасота. И дико медленно.

[identity profile] cryinstone.livejournal.com 2005-01-23 01:38 pm (UTC)(link)
TOAClientDataSet есть класс в одной конторе, где мы с г-ном Печкиным имели счастье работать вместе. Правда, я начал выпендриваться, за что меня оттуда недавно и поперли. С тех пор написатель сего находится в поисках программисткого джоба.

[identity profile] pechkin.livejournal.com 2005-01-24 12:01 am (UTC)(link)
Не надо медленно. Пусть лучше будет не очень красиво.

Хотя -- я тут человек маленький, могу и поизвращаться в свое удовольствие, никто особенно не заметит, а мне приятно.