-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathschema.sql
More file actions
186 lines (167 loc) · 5.42 KB
/
Copy pathschema.sql
File metadata and controls
186 lines (167 loc) · 5.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
-- NOTE: requires a compile-time setting to allow this
PRAGMA foreign_keys = ON;
CREATE TABLE job_types
(
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL
);
INSERT INTO job_types (id, name)
VALUES
(1, 'task'),
(2, 'service');
CREATE TABLE jobs (
id INTEGER PRIMARY KEY,
job_id TEXT UNIQUE NOT NULL,
job_type_id INTEGER NOT NULL,
description VARCHAR,
wait BOOLEAN NOT NULL DEFAULT 0 CHECK (wait IN (0,1)),
gid VARCHAR,
init_groups BOOLEAN NOT NULL DEFAULT 1 CHECK (init_groups IN (0,1)),
keep_alive BOOLEAN NOT NULL DEFAULT 0 CHECK (keep_alive IN (0,1)),
root_directory VARCHAR NOT NULL DEFAULT '/',
standard_error_path VARCHAR NOT NULL DEFAULT '/dev/null',
standard_in_path NOT NULL DEFAULT '/dev/null',
standard_out_path NOT NULL DEFAULT '/dev/null',
start_order INT,
umask VARCHAR DEFAULT '022',
user_name VARCHAR,
working_directory VARCHAR NOT NULL DEFAULT '/',
FOREIGN KEY (job_type_id) REFERENCES job_types (id) ON DELETE RESTRICT
);
CREATE TABLE job_methods (
id INTEGER PRIMARY KEY,
job_id INTEGER NOT NULL,
name TEXT NOT NULL, -- start, stop, etc.
script TEXT NOT NULL, -- a sh(1) script
FOREIGN KEY (job_id) REFERENCES jobs (id) ON DELETE CASCADE
);
-- Ordering: the "before_job_id" will be started before the "after_job_id"
CREATE TABLE job_depends
(
id INTEGER PRIMARY KEY,
before_job_id TEXT NOT NULL
REFERENCES jobs (job_id)
ON DELETE CASCADE
DEFERRABLE INITIALLY DEFERRED,
after_job_id TEXT NOT NULL
REFERENCES jobs (job_id)
ON DELETE CASCADE
DEFERRABLE INITIALLY DEFERRED
);
-- Environment variables for each job.
CREATE TABLE jobs_environment (
id INTEGER PRIMARY KEY,
job_id INTEGER,
env_key TEXT NOT NULL,
env_value TEXT NOT NULL,
UNIQUE (job_id, env_key),
FOREIGN KEY (job_id) REFERENCES jobs (id) ON DELETE CASCADE
);
---
--- JOB PROPERTIES
---
--- names for datatypes. Keep this in sync with parser.h datatypes.
CREATE TABLE datatypes
(
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL
);
INSERT INTO datatypes (id, name)
VALUES
(1, 'integer'),
(2, 'string'),
(3, 'boolean');
CREATE TABLE properties
(
id INTEGER PRIMARY KEY,
job_id INTEGER NOT NULL,
datatype_id INTEGER NOT NULL,
name TEXT NOT NULL,
default_value TEXT NOT NULL,
current_value TEXT NOT NULL,
UNIQUE (job_id, name),
FOREIGN KEY (datatype_id) REFERENCES datatypes (id) ON DELETE RESTRICT,
FOREIGN KEY (job_id) REFERENCES jobs (id) ON DELETE CASCADE
);
CREATE VIEW properties_view
AS
SELECT id,
job_id,
(SELECT jobs.job_id FROM jobs WHERE jobs.id = properties.job_id) AS job_name,
(SELECT name FROM datatypes WHERE datatypes.id = datatype_id) AS datatype,
name,
current_value AS value,
(name || '=''' || replace(current_value, '''', '''"''"''') || '''') AS shellcode,
CASE
WHEN current_value = default_value THEN 'default'
ELSE 'custom'
END
source
FROM
properties;
CREATE TABLE job_states
(
id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL
);
-- Keep this in sync with enum job_state.
INSERT INTO job_states (id, name)
VALUES
(1, 'disabled'),
(2, 'pending'),
(3, 'starting'),
(4, 'running'),
(5, 'stopping'),
(6, 'stopped'),
(7, 'complete'),
(8, 'error');
CREATE TABLE processes
(
pid INTEGER PRIMARY KEY, -- matches kernel PID
job_id INTEGER UNIQUE NOT NULL,
exited INTEGER CHECK (exited IN (0, 1)),
exit_status INTEGER,
signaled INTEGER CHECK (signaled IN (0, 1)),
signal_number INTEGER,
start_time INTEGER NOT NULL DEFAULT 0,
end_time INTEGER NOT NULL DEFAULT 0,
FOREIGN KEY (job_id) REFERENCES jobs (id) ON DELETE RESTRICT
);
CREATE TABLE jobs_current_states
(
id INTEGER PRIMARY KEY,
job_id INTEGER UNIQUE NOT NULL,
job_state_id INTEGER NOT NULL,
FOREIGN KEY (job_id) REFERENCES jobs (id) ON DELETE CASCADE,
FOREIGN KEY (job_state_id) REFERENCES job_states (id) ON DELETE RESTRICT
);
CREATE VIEW jobs_current_states_view AS
SELECT jobs.job_id, job_states.name
FROM jobs_current_states
LEFT JOIN jobs ON jobs.id = jobs_current_states.job_id
LEFT JOIN job_states ON job_states.id = jobs_current_states.job_state_id
ORDER BY jobs.job_id;
CREATE VIEW runnable_jobs AS
SELECT jobs.id FROM jobs
JOIN jobs_current_states ON jobs.id = jobs_current_states.job_id
WHERE jobs.id NOT IN (SELECT job_id AS id FROM processes)
AND job_state_id = (SELECT id FROM job_states WHERE name = 'pending');
CREATE VIEW job_table_view
AS
SELECT jobs.id AS ID,
jobs.job_id AS Label,
(SELECT name FROM job_states WHERE id = job_state_id) AS State,
(SELECT name FROM job_types WHERE id = job_type_id) AS "Type",
CASE
WHEN processes.exited = 1 THEN 'exit(' || processes.exit_status || ')'
WHEN processes.signaled = 1 THEN 'kill(' || processes.signal_number || ')'
ELSE '-'
END Terminated,
CASE
WHEN processes.end_time = 0 THEN (strftime('%s','now') - processes.start_time) || 's'
ELSE (processes.end_time - processes.start_time) || 's'
END Duration
FROM jobs
LEFT JOIN jobs_current_states ON jobs.id = jobs_current_states.job_id
LEFT JOIN processes ON processes.job_id = jobs.id
ORDER BY Label;