pgadmin3/include/pro_scheduler/pgproJob.h
2025-09-23 16:20:12 +05:00

406 lines
8.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// pgaJob.h - PostgreSQL Agent Job
//
//////////////////////////////////////////////////////////////////////////
#ifndef PGPROJOB_H
#define PGPROJOB_H
#include "schema/pgServer.h"
#include "schema/pgDatabase.h"
class pgproJobFactory : public pgDatabaseObjFactory
{
public:
pgproJobFactory();
virtual dlgProperty *CreateDialog(frmMain *frame, pgObject *node, pgObject *parent);
virtual pgObject *CreateObjects(pgCollection *obj, ctlTree *browser, const wxString &restr = wxEmptyString);
virtual pgCollection *CreateCollection(pgObject *obj);
int GetDisabledId()
{
return disabledId;
}
int GetRunId()
{
return runId;
}
protected:
int disabledId,runId;
};
extern pgproJobFactory projobFactory;
class pgproJob : public pgDatabaseObject
{
public:
pgproJob(const wxString &newName = wxT(""));
void SetEnabled(ctlTree *browser, const bool b);
int GetIconId();
void ShowTreeDetail(ctlTree *browser, frmMain *form = 0, ctlListView *properties = 0, ctlSQLBox *sqlPane = 0);
void ShowStatistics(frmMain *form, ctlListView *statistics);
pgObject *Refresh(ctlTree *browser, const wxTreeItemId item);
bool DropObject(wxFrame *frame, ctlTree *browser, bool cascaded);
wxString GetTranslatedMessage(int kindOfMessage) const;
wxString GetSql(ctlTree *browser);
bool NeedRefresh();
void iSetSched(int cron, const wxString &mi, const wxString& h, const wxString& d, const wxString& wd,const wxString& mon)
{
for (int i = 0; i < 60; i++) _mi[i] = false;
for (int i = 0; i < 24; i++) _h[i] = false;
for (int i = 0; i < 31; i++) _d[i] = false;
for (int i = 0; i < 7; i++) _wd[i] = false;
for (int i = 0; i < 12; i++) _mon[i] = false;
wxStringTokenizer confkey(mi.substr(1,mi.Len()-1),",");
while (confkey.HasMoreTokens())
{
wxString str = confkey.GetNextToken();
long j = atol(str.ToAscii());
_mi[j] = true;
}
confkey.SetString(h.substr(1, h.Len() - 1),",");
while (confkey.HasMoreTokens())
{
wxString str = confkey.GetNextToken();
long j = atol(str.ToAscii());
_h[j] = true;
}
confkey.SetString(wd.substr(1, wd.Len() - 1), ",");
while (confkey.HasMoreTokens())
{
wxString str = confkey.GetNextToken();
long j = atol(str.ToAscii());
_wd[j] = true;
}
confkey.SetString(d.substr(1, d.Len() - 1), ",");
while (confkey.HasMoreTokens())
{
wxString str = confkey.GetNextToken();
long j = atol(str.ToAscii())-1;
_d[j] = true;
}
confkey.SetString(mon.substr(1, mon.Len() - 1), ",");
while (confkey.HasMoreTokens())
{
wxString str = confkey.GetNextToken();
long j = atol(str.ToAscii())-1;
_mon[j] = true;
}
}
// получить индекс следующего элемента или -1 если его уже нет.
int getnext(bool array[],int len,int pos, int direct) {
//int len = sizeof(array) / sizeof(array[0]);
int mi = pos;
do {
mi = mi + direct;
if (mi > -1 && mi < len) {
}
else {
if (direct == 1 && mi == len) mi = 0;
if (direct == -1 && mi < 0) mi = len - 1;
mi = -1;
break;
}
} while (!array[mi]);
// возвращает -1 если нет слудующего элемента.
return mi;
}
// получить индекс первый/последний элемента
int getfirst(bool array[], int len, int direct) {
int mi = -1;
if (direct == -1) mi = len ;
do {
mi = mi + direct;
if (mi > -1 && mi < len) {
}
else {
if (direct == 1 && mi == len) mi = 0;
if (direct == -1 && mi < 0) mi = len - 1;
mi = -1;
break;
}
} while (!array[mi]);
return mi;
}
wxDateTime GetNextSchedule_At(wxDateTime prev_at, int dr) {
int mi = prev_at.GetMinute();
int h = prev_at.GetHour();
int d = prev_at.GetDay()-1;
int wd=prev_at.GetWeekDay();
int mon = prev_at.GetMonth();
int y = prev_at.GetYear();
bool novalid = false;
int nextp = getnext(_mi, sizeof(_mi) / sizeof(_mi[0]),mi, dr);
if (nextp == -1 || !_wd[wd]) {
mi = getfirst(_mi, sizeof(_mi) / sizeof(_mi[0]), dr);
nextp = getnext(_h, sizeof(_h) / sizeof(_h[0]), h, dr);
if (nextp == -1 || !_wd[wd]) {
// hours
h = getfirst(_h, sizeof(_h) / sizeof(_h[0]), dr);
do {
nextp = getnext(_d, sizeof(_d) / sizeof(_d[0]), d, dr);
if (nextp == -1) {
// days
d = getfirst(_d, sizeof(_d) / sizeof(_d[0]), dr);
nextp = getnext(_mon, sizeof(_mon) / sizeof(_mon[0]), mon, dr);
if (nextp == -1) {
// mon
mon = getfirst(_mon, sizeof(_mon) / sizeof(_mon[0]), dr);
y = y + dr;
}
else mon = nextp;
}
else d = nextp;
// day next
// проверим соответствие wdays
wxDateTime tmp((wxDateTime::wxDateTime_t) d + 1, (wxDateTime::Month) mon, y, (wxDateTime::wxDateTime_t)h, (wxDateTime::wxDateTime_t)mi);
novalid = !tmp.IsValid();
wd = tmp.GetWeekDay();
//if (nextp == -1) nextp=getfirst(_wd, dr);
} while (!_wd[wd] || novalid);
}
else h = nextp;
}
else mi = nextp;
//
wxDateTime tmp((wxDateTime::wxDateTime_t) d+1, (wxDateTime::Month) mon, y, (wxDateTime::wxDateTime_t)h, (wxDateTime::wxDateTime_t)mi);
return tmp;
}
wxDateTime GetSchedMin() const
{
return sched_min;
}
void iSetSchedMin(const wxDateTime& d)
{
sched_min = d;
}
wxString GetCrontab() const
{
return crontab;
}
void iSetCrontab(const wxString &s)
{
crontab = s;
}
bool GetEnabled() const
{
return enabled;
}
void iSetEnabled(const bool b)
{
enabled = b;
}
wxDateTime GetFinished() const
{
return finished;
}
void iSetFinished(const wxDateTime &d)
{
finished = d;
}
wxDateTime GetChanged() const
{
return changed;
}
void iSetChanged(const wxDateTime &d)
{
changed = d;
}
wxDateTime GetNextrun() const
{
return nextrun;
}
void iSetNextrun(const wxDateTime &d)
{
nextrun = d;
}
wxDateTime GetStarted() const
{
return lastrun;
}
void iSetStarted(const wxDateTime &d)
{
lastrun = d;
}
wxString GetMessage() const
{
return message;
}
void iSetMessage(const wxString &s)
{
message = s;
}
wxString GetStatus() const
{
return status;
}
void iSetStatus(const wxString &s)
{
status = s;
}
wxString GetRunAs() const
{
return runas;
}
void iSetRunAs(const wxString &s)
{
runas = s;
}
void iSetSameTransaction(bool b)
{
use_same_transaction = b;
}
bool GetSameTransaction()
{
return use_same_transaction;
}
wxString GetTryName() const
{
return tryname;
}
wxString GetFullName()
{
return GetName() + wxT("(") + NumToStr(recId) + wxT(")");
}
void iSetTryName(const wxString &s)
{
tryname = s;
}
wxString GetRule() const
{
return rule;
}
void iSetRule(const wxString &s)
{
rule = s;
}
wxString GetCommands() const
{
return commands;
}
void iSetCommands(const wxString &s)
{
commands = s;
}
long GetRecId() const
{
return recId;
}
void iSetRecId(const long l)
{
recId = l;
}
bool RunNow();
wxMenu *GetNewMenu();
bool CanCreate()
{
return false;
}
bool CanView()
{
return true;
}
bool CanEdit()
{
return true;
}
bool CanDrop()
{
return true;
}
bool WantDummyChild()
{
return false;
}
wxString GetHelpPage(bool forCreate) const
{
return wxT("pgagent-jobs");
}
private:
bool enabled, use_same_transaction;
wxDateTime finished, changed, nextrun, lastrun,sched_min;
wxDateTime nextrefresh;
wxString message, crontab, runas, commands,status,rule,tryname;
bool _d[31], _h[24], _mi[60], _wd[7], _mon[12];
long recId;
};
class pgproJobObject : public pgServerObject
{
public:
pgproJobObject(pgproJob *job, pgaFactory &factory, const wxString &newName);
virtual pgproJob *GetJob()
{
return job;
}
bool CanCreate()
{
return job->CanCreate();
}
bool CanView()
{
return false;
}
bool CanEdit()
{
return job->CanEdit();
}
bool CanDrop()
{
return job->CanDrop();
}
protected:
pgproJob *job;
};
class pgproJobCollection : public pgDatabaseObjCollection
{
public:
pgproJobCollection(pgaFactory *factory, pgDatabase *db);
wxString GetTranslatedMessage(int kindOfMessage) const;
};
class enabledisableJobFactory : public contextActionFactory
{
public:
enabledisableJobFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
wxWindow *StartDialog(frmMain *form, pgObject *obj);
bool CheckEnable(pgObject *obj);
bool CheckChecked(pgObject *obj);
};
class prorunNowFactory : public contextActionFactory
{
public:
prorunNowFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
wxWindow *StartDialog(frmMain *form, pgObject *obj);
bool CheckEnable(pgObject *obj);
};
#endif