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;
}

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

Post a comment in response:

If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting