Russian Qt Forum
Ноябрь 05, 2024, 13:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сервис-планировщик с поддержкой QtScript  (Прочитано 3746 раз)
Rem Norton
Гость
« : Сентябрь 10, 2011, 01:11 »

В общем стала задачи автоматизации одного комплекса. Вдоволь надолбавшись со стандартными Windows-средствами изваял сие "творенье".
Исходники в приложении. ВНИМАНИЕ: теоретически код кроссплатформенный, НО тестировался только под виндой (в Linux хватает cron + sh).
Как работает:
Читает файл "crontab" формат как в Linux и по расписанию выполняет скрипты (QtScript с маленьким довеском).
ВЫЖНО: файл "crontab" (без расширения) должен быть рядом с exe-шником (пример crontab в приложении). Относительные пути так же вычисляются от местоположения exe-шника.

Дополнительный объекты в скриптах:
1. "ODBC" -  Выполняет подключение к БД.
    Умеет:
1.1 Соединиться с сервером
Код:
bool open(QString type, QString server, QString db, QString name);
bool open(QString type, QString server, QString db, QString user, QString pwd, QString name);
,где:
type - тип соединения (см. ниже по тексту)
server - сервер
db - БД
user, pwd - логин и пароль
name - уникальное (для одного скрипта) имя подключения

Код:
bool open(QString conn, QString name);
, где:
conn - полная строка подключения (ODBC Connection String)
name - уникальное (для одного скрипта) имя подключения

1.2 Выполнить запрос, с получением единичного результата:
Код:
QVariant execScript(QString script)
, где:
script - собственно запрос

1.3 Закрыть соединение с базой:
Код:
void close()

1.4 Рассказать о своем состоянии:
Код:
bool isError() // true, если последняя операция вызвала ошибку
bool isOpen() // true, если соединение активно (открыто)
QString lastError() // текст сообщения о последней ошибке


Поддерживаемые типы соединения:
MSSQL2000    - MSSQL 2000
MSSQL2000_TR    - MSSQL 2000 без авторизации (trusted)
MSSQL2005     - MSSQL 2005
MSSQL2005_TR    - MSSQL 2005 без авторизации (trusted)
PSGSQL_STD   - PostgreSQL старых версий (до 7.х включительно)
PSGSQL_ANSI   - PostgreSQL ANSI (> 8.0)
PSGSQL_UNICODE   - PostgreSQL UNICODE (> 8.0)
PSGSQL_SSL   - PostgreSQL защищенное SSL соединение (> 8.0)
ORACLE      - ORACLE (кроме XE)

2. "DBQuery" - запрос данных из БД. Подключается через открытый объект "ODBC"
Код:
bool connect(QString name) // name имя подключения (зараннее открытого ODBC)
// навигация по записям:
bool next();
bool prev();
bool last();
bool first();
// все функции возвращают false, если движение по ResultSet'у в данном направлении не возможно

//получение значения текущего поля
QVariant value(QString field) // field - имя поля

3. "ServiceController" - управляет другими сервисами на одной с ним машине
    Умеет:
Код:
//Фактически оболочка для QtServiceController из QtSolutions
bool start(QString serviceName);
bool stop(QString serviceName);
bool pause(QString serviceName);
bool resume(QString serviceName);
bool restart(QString serviceName);
bool command(QString serviceName, int code);
bool uninstall(QString serviceName);
bool install(const QString & serviceFilePath, const QString & account = QString(), const QString & password = QString());
bool isInstalled(QString serviceName);
bool isRunning(QString serviceName);
ВАЖНО: serviceName далеко не всегда совпадает с serviceDisplayedName!!! serviceName - это то, что отображается в свойствах сервиса в самой верхней строке! По злой иронии MicroSoft эта строка не копируется в буфер обмена.

4. "INI" - читает параметры из ini-файлов
    Умеет:
Код:
//Фактически оболочка для QSettings
bool open(QString fName);
bool beginGroup(QString grName);
void endGroup();
QVariant value(QString key);


Ну вот как-то так.

P.S. Ах, да, по порту 8080 показывает выполняемые задания. Вроде как зайчатки web-интерфейса  Смеющийся
Записан
Rem Norton
Гость
« Ответ #1 : Сентябрь 10, 2011, 01:24 »

А, ну и пару примеров:

Код:
//так, например, можно определить живой ли еще SQL и если нет - перезапустить
method = "MSSQL2000_TR"
server = "server"
db = "master"

var live = 1;

var cn = new ODBC();
if (cn.open(method,server,db,"c1"))
{
  if (cn.execScript("select 2*2") != 4) live = 0
}
else live = 0;

if (live ==0)
{
 var sc = new ServiceController();
 sc.restart("SqlSrvr");
 Error("Сбой SQL сервера, перезапуск); // Это сообщение будет в системном логе.
}

а так можно прогнать скрипт на сервере, вычитанном из ini-файла

Код:
var set = new INI(); 
var server, db, method;
var conName = 'CRM'

if (set.open("sql.ini"))
{
if (set.beginGroup("connect"))
 {
  server = set.value("CRMserver");
  db = set.value("CRMbase");
  method = set.value("method");
 }
}
else Error("can not open INI-file");

var cn = new ODBC();
if (cn.open(method,server,db,conName))
{
 cn.execScript("update tEdition set nStatus = dbo.fGetEditionPublicStatus(id)");
 if (cn.isError()) Error(cn.lastError());
}
else
{
 Error(cn.lastError());
}


Да, скоро научу его в инет ходить за контентом, на FTP файлы ложить/забирать ну и просто на файловую систему ходить. Как закончу - выложу обновленный.
Пожелания по функционалу приветствуются.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.102 секунд. Запросов: 20.