mirror of
https://github.com/levinsv/pgadmin3.git
synced 2026-05-15 14:15:49 -06:00
406 lines
8.6 KiB
C++
406 lines
8.6 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// 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
|