-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatabase.py
More file actions
204 lines (174 loc) · 5.79 KB
/
Copy pathdatabase.py
File metadata and controls
204 lines (174 loc) · 5.79 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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
"""
database.py
SQLite schema and connection helpers for the Smart Airport Digital Twin.
Every entity in the airport ecosystem (flights, passengers, baggage, gates,
runways, crew, resources, weather, incidents) lives in this single SQLite
database so every module can read/write a shared, consistent state.
"""
import os
import sqlite3
DB_PATH = os.path.join(os.path.dirname(__file__), "airport_twin.db")
SCHEMA = """
CREATE TABLE IF NOT EXISTS sim_clock (
id INTEGER PRIMARY KEY CHECK (id = 1),
sim_time_value TEXT NOT NULL,
tick_count INTEGER NOT NULL DEFAULT 0
);
CREATE TABLE IF NOT EXISTS aircraft (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tail_number TEXT NOT NULL,
ac_type TEXT NOT NULL,
capacity INTEGER NOT NULL,
status TEXT NOT NULL DEFAULT 'PARKED'
);
CREATE TABLE IF NOT EXISTS crew (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
role TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'AVAILABLE',
flight_id INTEGER
);
CREATE TABLE IF NOT EXISTS gates (
id INTEGER PRIMARY KEY AUTOINCREMENT,
gate_number TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'AVAILABLE',
flight_id INTEGER
);
CREATE TABLE IF NOT EXISTS runways (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'AVAILABLE',
flight_id INTEGER
);
CREATE TABLE IF NOT EXISTS flights (
id INTEGER PRIMARY KEY AUTOINCREMENT,
flight_number TEXT NOT NULL,
airline TEXT NOT NULL,
origin TEXT NOT NULL,
destination TEXT NOT NULL,
international INTEGER NOT NULL DEFAULT 0,
aircraft_id INTEGER,
gate_id INTEGER,
runway_id INTEGER,
scheduled_departure TEXT NOT NULL,
actual_departure TEXT,
status TEXT NOT NULL DEFAULT 'SCHEDULED',
delay_minutes INTEGER NOT NULL DEFAULT 0,
weather_factor REAL NOT NULL DEFAULT 0.0,
boarding_progress REAL NOT NULL DEFAULT 0.0,
passengers_total INTEGER NOT NULL DEFAULT 0,
passengers_checked_in INTEGER NOT NULL DEFAULT 0,
passengers_boarded INTEGER NOT NULL DEFAULT 0,
priority INTEGER NOT NULL DEFAULT 0,
maintenance_ok INTEGER NOT NULL DEFAULT 1
);
CREATE TABLE IF NOT EXISTS passengers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
flight_id INTEGER NOT NULL,
seat TEXT,
status TEXT NOT NULL DEFAULT 'BOOKED',
bag_count INTEGER NOT NULL DEFAULT 0,
checkin_method TEXT,
vip INTEGER NOT NULL DEFAULT 0
);
CREATE TABLE IF NOT EXISTS baggage (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tracking_id TEXT NOT NULL,
passenger_id INTEGER NOT NULL,
flight_id INTEGER NOT NULL,
status TEXT NOT NULL DEFAULT 'PENDING',
location TEXT,
lost_risk REAL NOT NULL DEFAULT 0.0,
lost INTEGER NOT NULL DEFAULT 0
);
CREATE TABLE IF NOT EXISTS checkin_counters (
id INTEGER PRIMARY KEY AUTOINCREMENT,
counter_type TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'CLOSED',
queue_length INTEGER NOT NULL DEFAULT 0,
flight_id INTEGER
);
CREATE TABLE IF NOT EXISTS security_checkpoints (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
queue_length INTEGER NOT NULL DEFAULT 0,
status TEXT NOT NULL DEFAULT 'OPEN',
alert TEXT
);
CREATE TABLE IF NOT EXISTS weather (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL,
condition TEXT NOT NULL,
visibility_km REAL NOT NULL,
wind_speed_kmh REAL NOT NULL,
impact_factor REAL NOT NULL
);
CREATE TABLE IF NOT EXISTS incidents (
id INTEGER PRIMARY KEY AUTOINCREMENT,
type TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'ACTIVE',
module TEXT NOT NULL,
timestamp TEXT NOT NULL,
description TEXT NOT NULL,
severity TEXT NOT NULL DEFAULT 'MEDIUM',
response TEXT
);
CREATE TABLE IF NOT EXISTS resources (
id INTEGER PRIMARY KEY AUTOINCREMENT,
type TEXT NOT NULL,
name TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'AVAILABLE',
assigned_to TEXT
);
CREATE TABLE IF NOT EXISTS ground_vehicles (
id INTEGER PRIMARY KEY AUTOINCREMENT,
type TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'IDLE',
aircraft_id INTEGER
);
CREATE TABLE IF NOT EXISTS event_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL,
module TEXT NOT NULL,
message TEXT NOT NULL
);
"""
TABLE_NAMES = [
"sim_clock", "aircraft", "crew", "gates", "runways", "flights", "passengers",
"baggage", "checkin_counters", "security_checkpoints", "weather", "incidents",
"resources", "ground_vehicles", "event_log",
]
def get_connection():
conn = sqlite3.connect(DB_PATH, check_same_thread=False)
conn.row_factory = sqlite3.Row
conn.execute("PRAGMA foreign_keys = ON")
return conn
def init_db(reset=False):
"""Create the database and return a connection.
Important: this never deletes the underlying .db file. On Windows, an
open sqlite3 connection holds an OS-level lock on the file, so
os.remove() on a freshly-opened (or still-open, e.g. from a previous
Streamlit session) connection raises PermissionError [WinError 32].
Instead, `reset=True` clears every table in place via DROP + CREATE,
which works identically on Windows, macOS and Linux.
"""
conn = get_connection()
if reset:
for table in TABLE_NAMES:
conn.execute(f"DROP TABLE IF EXISTS {table}")
conn.commit()
conn.executescript(SCHEMA)
conn.commit()
return conn
def is_initialized(conn):
row = conn.execute("SELECT COUNT(*) AS c FROM flights").fetchone()
return row["c"] > 0
def log_event(conn, module, message, timestamp):
conn.execute(
"INSERT INTO event_log (timestamp, module, message) VALUES (?, ?, ?)",
(timestamp, module, message),
)
def df(conn, query, params=()):
"""Run a query and return a list of sqlite3.Row results."""
return conn.execute(query, params).fetchall()