1. C++ / Говнокод #19555

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    std::string sql = "INSERT INTO digest_test_record (set_id, ref_digest, cand_digest, vdt_cfg_warn, digest_cfg_warn, "
        "ref_duration, ref_cardinality, ref_dispersion, "
        "cand_duration, cand_cardinality, cand_dispersion, "
        "cardinality, difference, red_difference, ext_difference, "
        "inv_cardinality, inv_difference, inv_red_difference, inv_ext_difference,
        "timing, lib_version) SELECT 0, "
        "ROW($1, $2, $3, $4, $5, $6, $7, $8)::digest_info, "
        "ROW($9, $10, $11, $12, $13, $14, $15, $16)::digest_info,"
        "$17, $18, ",
        "$19, $20, $21, "
        "$22, $23, $24, "
        "$25, $26, $27, $28, "
        "$29, $30, $31, $32, "
        "$33, ROW($34, $35, $36, make_date($37, $38, $39), $40)::lib_version_info";
    
        cn.prepare("insert", sql);
    
        xact.prepared("insert")
        (ref_digest_info.src_width)(ref_digest_info.src_height)(ref_digest_info.src_fps)(ref_digest_info.src_duration)
            (ref_digest_info.vdt_duration)(ref_digest_info.cardinality)(ref_digest_info.has_flags)(ref_digest_info.src_filename)
        (cand_digest_info.src_width)(cand_digest_info.src_height)(cand_digest_info.src_fps)(cand_digest_info.src_duration)
            (cand_digest_info.vdt_duration)(cand_digest_info.cardinality)(cand_digest_info.has_flags)(cand_digest_info.src_filename)
        (results.vdt_cfg_warn)(results.digest_cfg_warn)
        (results.ref_duration)(results.ref_cardinality)(results.ref_dispersion)
        (results.cand_duration)(results.cand_cardinality)(results.cand_dispersion)
        (results.cardinality)(results.difference)(results.red_difference)(results.ext_difference)
        (results.inv_cardinality)(results.inv_difference)(results.inv_red_difference)(results.inv_ext_difference)
        ((double)timing / CLOCKS_PER_SEC)(li.main_ver)(li.sub_ver)(li.revision)(li.year)(li.month)(li.day)(li.platform).exec();

    Мои глаза.... Яркий пример использования нативного pqxx

    Запостил: leon_mz, 01 Марта 2016

    Комментарии (44) RSS

    • я может чего не понимаю, но они там конкатенацию не забыли?
      Ответить
      • Компилятор c/c++ клеит смежные строки сам.
        Ответить
        • Смежные константные литералы строк. Со всякими std::string уже не поклеит :)
          Ответить
          • >константные литералы
            Тавтология.

            Откуда эта говнофича пошла?
            Ответить
            • #define FOO    "foo"
              #define BAR    "bar"
              #define BAZ    FOO "-" BAR
              Ответить
              • показать все, что скрытоFOO и BAR нихуя не литералы же. Алсо
                >Откуда эта говнофича пошла?
                Ответить
                • >FOO и BAR нихуя не литералы же.

                  Уже сколько сюда не заходил, тыкнул в первый тред и оп... Очередная тупость от сёмы-анонимба.
                  Вот поясни, ты специально дебилом прикидываешься, чтоб у всех была myötähäpeä. Или это врождённое?
                  Ответить
                  • > myötähäpeä
                    Говнокод образовательный. Спасибо.

                    >>FOO и BAR нихуя не литералы же.
                    > Очередная тупость от сёмы-анонимба.
                    Мне кажется, myötähäpeä у посетителей ГК недостаточная какая-то вышла, я бы хотел добавить немного от себя, если позволите.
                    Почему отрицание принадлежности FOO и BAR к классу литералов - проявление тупости? "foo", "bar" - литералы; FOO, BAR - псевдонимы для этих литералов, но после посещения программы препроцессором таковыми становятся, но это уже вроде как не важно, иначе можно было бы сказать, что x в программе int x = 3+2; printf("%d", x); - литерал, т.к. в режиме оптимизации копмилятор преобразует его в число, которое свежей костью положат на стек в миску принтэфу.
                    Ответить
                    • Компилятор вообще этого FOO не увидит, т.е оно не является частью программы на языке C, а x исчезнет только после оптимизации (распространения константы)

                      хз зачем я это сказал
                      Ответить
                      • > Компилятор вообще этого FOO не увидит, т.е оно не является частью программы на языке C
                        Т.е. выходит, что это переменная на другом языке, и вообще никак литералом быть не может, т.е. 3.14дар абсолютно прав.
                        В случае, если это часть языка си, можно было ещё поболтать о преобразованиях в литерал и т.п.
                        Ответить
                        • Я вообще могу грубо заблуждаться, но мне кажется что препроцессинг не входит в компиляцию.
                          Тогда FOO - это переменная на языке препроцессора СИ.
                          И после обработки каждая FOO заменится литералом.

                          хм

                          поэтому FOO является переменной с точки зрения препроцессора, но константой времен компиляции с точки зрения компилятора си. То есть одновременно и тем и тем. Таким образом FOO - квантовая переменная
                          Ответить
                        • > выходит, что это переменная на другом языке, и вообще никак литералом быть не может

                          Никто и не утверждал, что это литералы.

                          Дефекейт привёл пример, когда это действительно нужно - когда нужно склеить строки, поступающие на этапе компиляции (или препроцессинга) из разных источников.

                          Ещё один типичный пример -
                          uintmax_t n = get_size();
                          // PRIxMAX is a macro
                          printf("Size: " PRIxMAX "\n", n);
                          Ответить
                          • Расширяем printf для печати GUID'ов:
                            #define PGUID "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}"
                            #define EGUID(x) (x).data1, (x).data2, (x).data3, (x).data4[0], (x).data4[1], \
                                (x).data4[2], (x).data4[3], (x).data4[4], (x).data4[5], (x).data4[6], (x).data4[7]
                            printf("GUID is " PGUID "\n", EGUID(guid));
                            Ответить
                  • 3,14, просто иди нахуй, тварь!
                    Ответить
                • Учил си семен
                  Увидел шаблон
                  Осилит не смог
                  ведь он - пидарок

                  тара тара пам! пиу! хх!
                  Ответить
                • Повторю вопрос - откуда пошла говнофича неявного склеивания строк "фыв" "ячс"
                  и какой петух притащил ее в питон?
                  Ответить
                  • > говнофича
                    Да ну, полезное свойство.
                    Ответить
                    • В Питоне точно гахер не нужно
                      Ответить
                      • Там это вызывает странные баги? (например, что-то вроде жсовской автоматической точки с запятой после return)
                        Ответить
                        • Забытая запятая в списке/кортеже дает слияние строк, притом, что + делает то же самое с точностью до байткода.
                          Ответить
                  • > откуда пошла говнофича неявного склеивания строк
                    Тебе же уже столько примеров показали...

                    Ради сишных макросов она запилена в хуй знает какие годы... Препроцессор в конкатенацию литералов не умеет. А иногда нужно (к примеру, вывести имя файла __FILE__, номер строки __LINE__ и твой текст как одну const char *: DEBUG("my text") -> debug_log("test.c" ":" "200" " " "my text"). Поэтому всё что ты можешь сделать из макроса - приставить литералы друг к другу, а конпелятор их потом склеит сам.
                    Ответить
                    • Примеров и откуда пошла
                      это разные вещи, включи моск.
                      Ответить
                  • >> и какой петух притащил ее в питон?

                    Принц Гвидон же
                    Ответить
                    • И нахуя? Потому что оно есть в си? Нахуй это не выпилили в тройке? Ок, обратная совместимость, но почему нету статических тестеров, которые на них матерятся?
                      Ответить
                      • > И нахуя?
                        Да кто ж его знает. Макросов в питоне нет, поэтому смысла в этой фиче ну абсолютно никакого.

                        З.Ы. Пытались выпилить таки: http://legacy.python.org/dev/peps/pep-3126/
                        Ответить
                        • Пытались не считается. Где правило для pylint, я спрашиваю?
                          Ответить
                          • > Где правило для pylint
                            Добавь...

                            Любители многострочных регулярок и SQL запросов, видимо, уговорили оставить эту говнофичу и не делать проверок на неё...
                            Ответить
                            • Может, лучше ты?

                              В чем проблема дописать +? но ее блядь даже в качестве опции нету.
                              Ответить
                              • >но ее блядь даже в качестве опции нету.
                                В линте
                                Ответить
    • Что не так с pqxx? Как улучшить код?
      Ответить
      • ORM?
        Ответить
        • > ORM

          Радикальненько. А если используются фишки, специфичные для Pg? Наследования таблиц для шардирования, hstore, индексы по json и прочая радость? Как улучшить код, не переписывая его целиком в XML под ORM с сомнительной выгодой?
          Ответить
          • Тут основная проблема, имхо - хер поймёшь, какое выражение для какого параметра. Может быть попробовать совместить параметр и значение?

            query() + "where foo = " + arg(x.foo)

            Очевидный минус - потеряем подготовленные запросы.
            Ответить
            • > подготовленные запросы
              не знаю как постгрес, надо почитать, но оракл давно уже подобные аргументы сам заменяет на плейсхолдеры под биндящиеся значения
              даже до маразма доходит, когда он переделывает select 1 from ... в select :SYS_B0 from ...

              но да, хорошая либа должна позволять задать аргументы биндов не только тупо по порядку, но и по имени
              Ответить
          • Или, раз уж баксы начали нумеровать, довести идею до конца и доьавить параметр с циферкой в оператор (). И видно, что куда пойдёт и программно сверить можно.
            Ответить
            • Да, с циферкой, как в жабьем jdbc, было бы лучше, с именами - ещё лучше.

              Если принять, что pqxx такой возможности пока нет (http://pqxx.org/devprojects/libpqxx/doc/3.1/html/Reference/a00047.html) мы править не собираемся, то код в топике особо и не улучшишь.

              P.S. Больше всего в pqxx меня колбасит то, что prepare не возвращает объект, а назначает prepared statement-ам строковые имена, которые нужно потом использовать для создания invocation.
              Ответить

    Добавить комментарий