• Вопрос по проектированию БД

    @abby
    Что делать, с таким примером:
    Document {id, name, ...}
    Tag {id, type, createdAt, origin, duplicate, editable, removedAt}
    DocumentTag {documentId, tagId}
    Company {id, tagId, name, display name, url, ... еще пять параметров}
    Location {id, tagId, lat, lon, country, state, city, ...}
    и еще пять шесть тегов
    

    ?
    Все сложить в одну таблицу — слишком жирно. С Single TI — стоэтажные запросы, при добавлении еще одного параметра или тега надо обойти кучу мест и поправить код.
  • Вопрос по проектированию БД

    @abby
    EugeneOZ,
    делайте, кто мешает то? ORM? Что за ORM такая? Нормальную ORM возьмите. DataMapper используйте, если ORM такая хрупенькая.

    Во-первых, это не совпадение, и именно отношение «это есть». Даже с ORM бывает не все так просто, а автор вопроса пишет еще и про фильтры. К сожалению вопрос действильно сложный и насущный.
    SilentSokolov, Я так понимаю, что проект (или эта часть проекта) довольно молодая, подумайте при каком подходе будет проще сменить его на другой подход. Т.е. выберете тот, при переходе с которого на другой не надо будет ломать голову и городить стоэтажные запросы.
  • Экранирование символов в QT?

    @abby
    Только что проверил на 5.1.0 все работает как и ожидалось.
    Реализация bool QSqlResult::savePrepare(const QString& query) вызывает сомнения в плане эффективности, непонятно зачем два раза query менять, если есть поддержка именованых параметров:

        // parse the query to memorize parameter location
        d->executedQuery = d->namedToPositionalBinding(query);
    
        if (driver()->hasFeature(QSqlDriver::NamedPlaceholders))
            d->executedQuery = d->positionalToNamedBinding(query);

    Не смотря на то, что sqlite вроде как поддерживает биндинг именовыных параметров, реализация sqlite драйвера в Qt это не учитывает, driver()->hasFeature(QSqlDriver::NamedPlaceholders) всегда возвращает false.
    Может быть у вас какая-то другая реализация дравйвера, что такое поведение.
    Так же советую обратить на формулировку в документации
    Both syntaxes work with all database drivers provided by Qt. If the database supports the syntax natively, Qt simply forwards the query to the DBMS; otherwise, Qt simulates the placeholder syntax by preprocessing the query.

    В моей версии Qt препроцессинг реализован в виде замены :VVV на ? и сохранения позиций «плэйсходеров», а вашей, судя по вашему комментарию, в виде простой подстановки значений.

    Сделайте SSCCE и посмотрите дебаггером, быстрее будет.
  • Вопрос по отображению веток в Git

    @abby
    В принципе разница между (A) git merge B и (B) git merge A есть, но бывают такие хитросплетения и ребэйзы, плюс человеческий факто никто не отменял (у нас постоянно вместо (master) git merge feature вливают master в feature ветку ). Плюс после удаления ветки восстановить её имя нельзя.
  • Два набора тестов для дебажной и релизной сборки?

    @abby
    в релизе возвращает нулевой указатель, в дебаге кидает экцепшин

    Я считаю, что лучше не стоит иметь разный тип логики в релизе и в дебаге. В вашем случае в релизе и в тестах вы сравниваете возвращаемое значение с nullptr, а в дебаге логика основана на исключениях. Либо всегда бросайте исключения, либо всегда проверяйте возвращаемое значение.
    тесты:
    EXPECT_EQ(nullptr, domainModel.getDocumentById(invalidId));
    auto document = domainModel.getDocumentById(validDocumentId);
    ASSERT_TRUE(nullptr != document);
    
    в клиентском коде:
    auto document = domainModel.getDocumentById(documentId);
    if (nullptr != document) {
      // do all business here
    }