Как сделать дебаг ZennoPoster.Db.ExecuteQuery

bigloafer

Client
Регистрация
23.07.2020
Сообщения
241
Благодарностей
75
Баллы
28
Postgresql 14, подключение Odbc.

Я разленился и не стал писать на C# обновление даты на уровне шаблона, и соответственно нашел в сети такой вот триггер, что переставлять дату на уровне базы. Т.е. взял строку, Postgresql сам вставил дату последнего изменения строки. А при получении строки я просто ORDER BY делаю и должно работать.
SQL:
--- Триггер обновления даты и функция ее дергающая
BEGIN;
CREATE OR REPLACE FUNCTION update_proxy_last_work()
RETURNS TRIGGER AS $$
BEGIN
      NEW.last_work = now();
      RETURN NEW;
END;
$$ language 'plpgsql';
COMMIT;
-- фукнция которая дергает триггер
CREATE TRIGGER update_timestamp_proxy_last_work BEFORE INSERT OR UPDATE ON proxy
FOR EACH ROW EXECUTE PROCEDURE update_proxy_last_work();
Использую метод ZennoPoster.Db.ExecuteQuery изначально который есть ZP.

Грубо говорят ZennoPoster.Db.ExecuteQuery порождает соединения с БД для каждого запроса. В процесс исполнения шаблона делает много запросов в БД и я выхожу по ошибке:
C#:
throw new Exception("Не смог взять прокси");
Потому что вернулась пустая строка и я не могу ее сплитануть на части через сепаратор.

C#:
lock(Locker.proxyDB) {
    string str_roxy = ZennoPoster.Db.ExecuteQuery(
            @"SELECT id, proxy, reboot FROM proxy WHERE active = TRUE AND work = 'Свободен' ORDER BY last_work LIMIT 1;",
            null,
            ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.Odbc,
            project.Variables["conn_db"].Value,
            "|",
            "#"
    );
    
    project.SendInfoToLog(str_roxy);
    
    //    Проверяем есть ли прокси в наличии
    if(str_roxy.Length == 0) {
        
        // Прокси нет в наличии
        project.SendToLog("Не смог взять прокси", ZennoLab.InterfacesLibrary.Enums.Log.LogType.Info, true, ZennoLab.InterfacesLibrary.Enums.Log.LogColor.Blue);
        throw new Exception("Не смог взять прокси");
        
    } else {
        
        //    Прокси есть
        project.Variables["id_proxy"].Value = str_roxy.Split('|')[0];
        project.Variables["proxy"].Value = str_roxy.Split('|')[1];
        project.Variables["proxy_reboot"].Value = str_roxy.Split('|')[2];
        
        string insertDbSql = String.Format(@"UPDATE proxy SET work = 'Работаю' WHERE ""id"" = {0}", project.Variables["id_proxy"].Value);
        var ins = ZennoPoster.Db.ExecuteNonQuery( insertDbSql , null, ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.Odbc, project.Variables["conn_db"].Value);
        
    }
}
Соответственно вопрос: Строка пустая вернулась, потому что ZP не смог поднять соединение, или потому что триггер не успел проставить дату и я в версионности попал в какую-нибудь блокировку и т.д.

Соответственно, как бы вернуть ошибку не произошло соединение или что-то подобнее.

Или как создать соединение и тащить соединение между кубиками?
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 941
Благодарностей
4 333
Баллы
113
Попробуйте обернуть в try/catch и обрабатывать ошибки в catch.
 
  • Спасибо
Реакции: djaga

djaga

Client
Регистрация
26.04.2020
Сообщения
505
Благодарностей
1 052
Баллы
93
Или как создать соединение и тащить соединение между кубиками?
Насколько я знаю. Тащить между кубиками созданный объект можно через "project.Context": ↓

Пример:
Пример передачи в project.Context:
NameClass a = new NameClass();
project.Context["NameContext"] = a;
Следующие кубики. Вызов project.Context:
var a = project.Context["NameContext"];
a.Method();
 
  • Спасибо
Реакции: Valek_333

bigloafer

Client
Регистрация
23.07.2020
Сообщения
241
Благодарностей
75
Баллы
28
Насколько я знаю. Тащить между кубиками созданный объект можно через "project.Context": ↓
Ну я так делал с MySql по этому примеру. В этом случае подключается отдельная dll библиотека, в которой есть метод conn() или connect() - что-то типо того ...

Ну а с postgresql, как так сделать?

Например я не смог найти версии Npgsql чтобы подошла для ZP. Npgsql наверное самая привлекательная библиотека.

Вот на сайте npgsql, что написано:

Opening and closing physical connections to PostgreSQL is an expensive and long process. Therefore, Npgsql connections are pooled by default: closing or disposing a connection doesn't close the underlying physical connection, but rather returns it to an internal pool managed by Npgsql. The next time a connection is opened, that pooled connection is returned again. This makes open and close extremely fast operations; do not hesitate to perform them a lot if needed, rather than holding a connection needlessly open for a long time.

For information on tweaking the pooling behavior (or turning it off), see the pooling section in the connection string page.
Пишут, чтобы не стеснялись делать запросы. Типо коннект обратно в пул возвращается...
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 367
Благодарностей
3 292
Баллы
113
Например я не смог найти версии Npgsql чтобы подошла для ZP.
Установите Developer Pack для .NET Framework 4.6.2: https://dotnet.microsoft.com/en-us/download/dotnet-framework/thank-you/net462-developer-pack-offline-installer.
Далее, в сторонней IDE (Visual Studio, Rider) создайте проект .NET Framework 4.6.2, добавьте через NuGet требуемые библиотеки, соберите в Release и из полученных dll удалите зависимости которые уже имеются у ZP в папке Progs, например Newtonsoft.Json.dll, netstandard.dll и т.д. (иначе конфликт), далее оставшиеся dll переместите в ExternalAssemblies (перепроверьте версию в пути и версию вашего постера). Может получиться значительное кол-во dll (там и зависимости), всех их потребуется передобавить в GAC.

Должна подойти.
 
  • Спасибо
Реакции: bigloafer и djaga

bigloafer

Client
Регистрация
23.07.2020
Сообщения
241
Благодарностей
75
Баллы
28
У меня стоит Developer Pack для .NET Framework 4.6.2 и стояло Visual Studio 2019 или может другой год какой был.
создайте проект .NET Framework 4.6.2, добавьте через NuGet требуемые библиотеки, соберите в Release
Сбилдить пытался. Для этого и ставил Visual Studio 2019.
из полученных dll удалите зависимости которые уже имеются у ZP в папке Progs, например Newtonsoft.Json.dll, netstandard.dll
Этого не делал и не умею. Но у меня пустая папка ExternalAssemblies на тот момент была.
Только недавно я начал пробовать Newtonsoft.Json.dll.
Может получиться значительное кол-во dll (там и зависимости), всех их потребуется передобавить в GAC.
А почему Npgsql не добавят превентивно в сборку?
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 367
Благодарностей
3 292
Баллы
113
Только недавно я начал пробовать Newtonsoft.Json.dll
Не используйте его в GAC! Он доступен по using Global.ZennoLab.Json.Linq;
А почему Npgsql не добавят превентивно в сборку?
Потому что он не используется в постере + у постера и так хватает зависимостей для конфликта с шаблонами, что требует серьёзную переделку, с выносом шаблонов в подпроцессы с новыми проблемами...
 

bigloafer

Client
Регистрация
23.07.2020
Сообщения
241
Благодарностей
75
Баллы
28
Установите Developer Pack для .NET Framework 4.6.2
В nuget 462 версии вообще нет, только Npgsql 4.1.11 так понимаю, что это есть последняя 4.1.11

Какого типа надо создать проект, чтобы сбилдить lkz ZP dll ?
Или мне надо как-то клонировать ветку с github ?
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 367
Благодарностей
3 292
Баллы
113
В nuget 462 версии вообще нет, только Npgsql 4.1.11 так понимаю, что это есть последняя 4.1.11
Значит пока только его.
Какого типа надо создать проект, чтобы сбилдить lkz ZP dll ?
Самый примитивный - консольный.
 
  • Спасибо
Реакции: bigloafer

bigloafer

Client
Регистрация
23.07.2020
Сообщения
241
Благодарностей
75
Баллы
28
Самый примитивный - консольный.
Не получается создать даже самый примитивный. Тогда в 2022 я так и не смог разобраться, как сбилдить библиотеку dll для ZennoPoster.

Основная проблема, что методы ZennoPoster не дают возможности тащить с собой соединение, а так же не дают возможности обрабатывать ошибки при выполнении (это вопрос обсуждался на форуме):
Методы ZennoPoster:
public static string ExecuteQuery(string sql) {
    return ZennoPoster.Db.ExecuteQuery( sql, null, ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.Odbc, dsn, "|", "#");
}
public static int ExecuteNonQuery(string sql) {
    return ZennoPoster.Db.ExecuteNonQuery(sql, null, ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.Odbc, dsn);
}
Из кода видно, что можно даже ошибки не обрабатывать. Внутри есть свой собственный try {} и я так понимаю, что под него не подлезть ни как.
Без обработки ошибок, при сложной логике работы с Postgresql не представляется возможными собрать реально хорошо продуманный скрипт - потому что Эксепшины он обрабатывает внутри себя.
Даже если я вытащу методы в общий код и начну их переопределять - это не избавить я думаю от проблемы закрытия соединения. Да и не факт, что получиться сделать переопределение.

Вот в теме по PostgreSql я спрашивал, что делать и как быть. Вот предлагается скачать исходники версии v4.0.12. Я скачал исходники Source code (zip) по ссылке.
В папке с исходниками есть sln файл - я так понимаю это файл решения.
SCR-20240409-djuv.png
В теории я должен его открыть и просто убрать зависимости все которые есть в Zenno и оставить зависимости служебные которые есть у самого компонента.
Но к сожалению, я так и не понял, как создать решение с Net 4.6.2. SDK установлен.

При попытке открыть файл Npgsql.sln выдает такое окно. Такое чувство, что новые версии VS 2022 не поддерживают старые версии языка программирования.
SCR-20240409-dkbs.png

Я и в 2022 с VS 2019 не мог сбилдить dll.
 

bigloafer

Client
Регистрация
23.07.2020
Сообщения
241
Благодарностей
75
Баллы
28
Удалось добыть файл dll. Работает на версии 7.7.0.0 - проверено.

Может кому понадобится.
 

Вложения

Ахилес

Client
Регистрация
11.11.2020
Сообщения
835
Благодарностей
337
Баллы
63
Удалось добыть файл dll. Работает на версии 7.7.0.0 - проверено.

Может кому понадобится.
Почему бы просто не взять последнюю версию dll с гитхаба, доступную для .net standart и не использовать ее, просто подключив ее без всяких лишних телодвижений ? :bn:

120153
 

bigloafer

Client
Регистрация
23.07.2020
Сообщения
241
Благодарностей
75
Баллы
28
Почему бы просто не взять последнюю версию dll с гитхаба, доступную для .net standart и не использовать ее, просто подключив ее без всяких лишних телодвижений ?
Где ее скачать? где именно ...
 

Ахилес

Client
Регистрация
11.11.2020
Сообщения
835
Благодарностей
337
Баллы
63

bigloafer

Client
Регистрация
23.07.2020
Сообщения
241
Благодарностей
75
Баллы
28

Ахилес

Client
Регистрация
11.11.2020
Сообщения
835
Благодарностей
337
Баллы
63
  • Спасибо
Реакции: bigloafer

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)