1 #ifndef NM_DATABASE_H_
2 #define NM_DATABASE_H_
3 
4 #include <nm_vector.h>
5 #include <stdbool.h>
6 
7 #include <sqlite3.h>
8 
9 #define NM_DB_VERSION "17"
10 
11 //@TODO Those queries should have constant naming convention and some kind of sorting
12 static const char NM_GET_VMS_SQL[] = \
13     "SELECT name FROM vms ORDER BY name ASC";
14 
15 static const char NM_GET_VMS_FILTER_GROUP_SQL[] = \
16     "SELECT name FROM vms WHERE team='%s' ORDER BY name ASC";
17 
18 static const char NM_CLONE_VMS_SQL[] = \
19     "INSERT INTO vms SELECT NULL, '%s', mem, smp, kvm, hcpu, '%d', arch, iso, " \
20     "install, usb, usbid, bios, kernel, mouse_override, kernel_append, tty_path, " \
21     "socket_path, initrd, machine, fs9p_enable, fs9p_path, fs9p_name, usb_type, " \
22     "spice, debug_port, debug_freeze, cmdappend, team, display_type FROM vms WHERE name='%s'";
23 
24 static const char NM_RESET_LOAD_SQL[] = \
25     "UPDATE vmsnapshots SET load='0' WHERE vm_name='%s'";
26 
27 static const char NM_USB_GET_SQL[] = \
28     "SELECT * FROM usb WHERE vm_name='%s'";
29 
30 static const char NM_USB_ADD_SQL[] = \
31     "INSERT INTO usb(vm_name, dev_name, vendor_id, product_id, serial) " \
32     "VALUES ('%s', '%s', '%s', '%s', '%s')";
33 
34 static const char NM_USB_DELETE_SQL[] = \
35     "DELETE FROM usb WHERE vm_name='%s' AND dev_name='%s' " \
36     "AND vendor_id='%s' AND product_id='%s' AND serial='%s'";
37 
38 static const char NM_USB_CHECK_SQL[] = \
39     "SELECT usbid FROM vms WHERE name='%s'";
40 
41 static const char NM_DEL_DRIVES_SQL[] = \
42     "DELETE FROM drives WHERE vm_name='%s'";
43 
44 static const char NM_DEL_DRIVE_SQL[] = \
45     "DELETE FROM drives WHERE vm_name='%s' AND drive_name='%s'";
46 
47 static const char NM_DEL_VMSNAP_SQL[] = \
48     "DELETE FROM vmsnapshots WHERE vm_name='%s'";
49 
50 static const char NM_DEL_IFS_SQL[] = \
51     "DELETE FROM ifaces WHERE vm_name='%s'";
52 
53 static const char NM_DEL_USB_SQL[] = \
54     "DELETE FROM usb WHERE vm_name='%s'";
55 
56 static const char NM_DEL_VM_SQL[] = \
57     "DELETE FROM vms WHERE name='%s'";
58 
59 static const char NM_USB_EXISTS_SQL[] = \
60     "SELECT id FROM usb WHERE vm_name='%s' AND dev_name='%s' " \
61     "AND vendor_id='%s' AND product_id='%s' AND serial='%s'";
62 
63 static const char NM_VM_GET_LIST_SQL[] = \
64     "SELECT * FROM vms WHERE name='%s'";
65 
66 static const char NM_VM_GET_IFACES_SQL [] = \
67     "SELECT if_name, mac_addr, if_drv, ipv4_addr, vhost, " \
68     "macvtap, parent_eth, altname, netuser, hostfwd, smb FROM ifaces " \
69     "WHERE vm_name='%s' ORDER BY if_name ASC";
70 
71 static const char NM_VM_GET_DRIVES_SQL[] = \
72     "SELECT drive_name, drive_drv, capacity, boot, discard " \
73     "FROM drives WHERE vm_name='%s' ORDER BY id ASC";
74 
75 static const char NM_VM_GET_ADDDRIVES_SQL[] = \
76     "SELECT drive_name, capacity FROM drives WHERE vm_name='%s' " \
77     "AND boot='0'";
78 
79 static const char NM_SNAP_GET_NAME_SQL[] = \
80     "SELECT * FROM vmsnapshots WHERE vm_name='%s' " \
81     "AND snap_name='%s'";
82 
83 static const char NM_GET_SNAPS_ALL_SQL[] = \
84     "SELECT * FROM vmsnapshots WHERE vm_name='%s' " \
85     "ORDER BY timestamp ASC";
86 
87 static const char NM_GET_SNAPS_NAME_SQL[] = \
88     "SELECT snap_name FROM vmsnapshots WHERE vm_name='%s' " \
89     "ORDER BY timestamp ASC";
90 
91 static const char NM_SNAP_UPDATE_LOAD_SQL[] = \
92     "UPDATE vmsnapshots SET load='1' " \
93     "WHERE vm_name='%s' AND snap_name='%s'";
94 
95 static const char NM_DELETE_SNAP_SQL[] = \
96     "DELETE FROM vmsnapshots WHERE vm_name='%s' " \
97     "AND snap_name='%s'";
98 
99 static const char NM_INSERT_SNAP_SQL[] = \
100     "INSERT INTO vmsnapshots(vm_name, snap_name, load, timestamp) " \
101     "VALUES('%s', '%s', '%d', DATETIME('now','localtime'))";
102 
103 static const char NM_UPDATE_SNAP_SQL[] = \
104     "UPDATE vmsnapshots SET load='%d', " \
105     "timestamp=DATETIME('now','localtime') " \
106     "WHERE vm_name='%s' AND snap_name='%s'";
107 
108 static const char NM_CHECK_SNAP_SQL[] = \
109     "SELECT id FROM snapshots WHERE vm_name='%s'";
110 
111 static const char NM_GET_BOOT_DRIVE_SQL[] = \
112     "SELECT drive_name FROM drives " \
113     "WHERE vm_name='%s' AND boot='1'";
114 
115 static const char NM_SELECT_DRIVE_NAMES_SQL[] = \
116     "SELECT drive_name FROM drives WHERE vm_name='%s'";
117 
118 static const char NM_GET_VETH_SQL[] = \
119     "SELECT l_name, r_name FROM veth";
120 
121 static const char NM_LAN_GET_VETH_SQL[] = \
122     "SELECT (l_name || '<->' || r_name) FROM veth ORDER by l_name ASC";
123 
124 static const char NM_LAN_ADD_VETH_SQL[] = \
125     "INSERT INTO veth(l_name, r_name) VALUES ('%s', '%s')";
126 
127 static const char NM_LAN_CHECK_NAME_SQL[] = \
128     "SELECT id FROM veth WHERE l_name='%s' OR r_name='%s'";
129 
130 static const char NM_LAN_DEL_VETH_SQL[] = \
131     "DELETE FROM veth WHERE l_name='%s'";
132 
133 static const char NM_GET_IFACES_SQL[] = \
134     "SELECT if_name FROM ifaces WHERE vm_name='%s'";
135 
136 static const char NM_GET_IFACE_SQL[] = \
137     "SELECT id FROM ifaces WHERE vm_name='%s' AND if_name='%s' AND if_drv='%s'";
138 
139 static const char NM_DEL_IFACE_SQL[] = \
140     "DELETE FROM ifaces WHERE vm_name='%s' AND if_name='%s'";
141 
142 static const char NM_GET_IFACES_MACS[] = \
143     "SELECT mac_addr FROM ifaces";
144 
145 static const char NM_GET_IFMAP_SQL[] = \
146     "SELECT vm_name, if_name FROM ifaces WHERE parent_eth='%s' " \
147     "OR parent_eth='%s'";
148 
149 static const char NM_GET_IFMAPGR_SQL[] = \
150     "SELECT vm_name, if_name FROM ifaces JOIN vms ON " \
151     "vm_name=name WHERE team='%s' AND (parent_eth='%s' OR parent_eth='%s')";
152 
153 static const char NM_GET_GROUPS_SQL[] = \
154     "SELECT DISTINCT team FROM vms WHERE team IS NOT NULL";
155 
156 static const char NM_LAN_VETH_INF_SQL[] = \
157     "SELECT if_name FROM ifaces WHERE parent_eth='%s'";
158 
159 static const char NM_LAN_VETH_DEP_SQL[] = \
160     "UPDATE ifaces SET macvtap='0', parent_eth='' " \
161     "WHERE parent_eth='%s' OR parent_eth='%s'";
162 
163 static const char NM_GET_VMSNAP_LOAD_SQL[] = \
164     "SELECT snap_name FROM vmsnapshots WHERE vm_name='%s' " \
165     "AND load='1'";
166 
167 static const char NM_USB_UPDATE_STATE_SQL[] = \
168     "UPDATE vms SET usbid='%s' WHERE name='%s'";
169 
170 static const char NM_VMCTL_GET_VNC_PORT_SQL[] = \
171     "SELECT vnc, spice FROM vms WHERE name='%s'";
172 
173 static const char NM_GET_DB_VERSION_SQL[] = \
174     "PRAGMA user_version";
175 
176 typedef sqlite3 nm_sqlite_t;
177 
178 typedef struct {
179     nm_sqlite_t *handler;
180     bool in_transaction;
181 } db_conn_t;
182 
183 #define NM_INIT_DB_CONN (db_conn_t) {NULL, false}
184 
185 void nm_db_init(void);
186 void nm_db_select(const char *query, nm_vect_t *v);
187 void nm_db_edit(const char *query);
188 bool nm_db_in_transaction();
189 void nm_db_begin_transaction();
190 void nm_db_atomic(const char *query);
191 void nm_db_commit();
192 void nm_db_rollback();
193 void nm_db_close(void);
194 
195 enum select_main_idx {
196     NM_SQL_ID = 0,
197     NM_SQL_NAME,
198     NM_SQL_MEM,
199     NM_SQL_SMP,
200     NM_SQL_KVM,
201     NM_SQL_HCPU,
202     NM_SQL_VNC,
203     NM_SQL_ARCH,
204     NM_SQL_ISO,
205     NM_SQL_INST,
206     NM_SQL_USBF,
207     NM_SQL_USBD,
208     NM_SQL_BIOS,
209     NM_SQL_KERN,
210     NM_SQL_OVER,
211     NM_SQL_KAPP,
212     NM_SQL_TTY,
213     NM_SQL_SOCK,
214     NM_SQL_INIT,
215     NM_SQL_MACH,
216     NM_SQL_9FLG,
217     NM_SQL_9PTH,
218     NM_SQL_9ID,
219     NM_SQL_USBT,
220     NM_SQL_SPICE,
221     NM_SQL_DEBP,
222     NM_SQL_DEBF,
223     NM_SQL_ARGS,
224     NM_SQL_GROUP,
225     NM_SQL_DISPLAY,
226     NM_VM_IDX_COUNT
227 };
228 
229 enum select_ifs_idx {
230     NM_SQL_IF_NAME = 0,
231     NM_SQL_IF_MAC,
232     NM_SQL_IF_DRV,
233     NM_SQL_IF_IP4,
234     NM_SQL_IF_VHO,
235     NM_SQL_IF_MVT,
236     NM_SQL_IF_PET,
237     NM_SQL_IF_ALT,
238     NM_SQL_IF_USR,
239     NM_SQL_IF_FWD,
240     NM_SQL_IF_SMB,
241     NM_IFS_IDX_COUNT
242 };
243 
244 enum select_drive_idx {
245     NM_SQL_DRV_NAME = 0,
246     NM_SQL_DRV_TYPE,
247     NM_SQL_DRV_SIZE,
248     NM_SQL_DRV_BOOT,
249     NM_SQL_DRV_DISC,
250     NM_DRV_IDX_COUNT
251 };
252 
253 enum select_usb_idx {
254     NM_SQL_USB_ID = 0,
255     NM_SQL_USB_VMNAME,
256     NM_SQL_USB_NAME,
257     NM_SQL_USB_VID,
258     NM_SQL_USB_PID,
259     NM_SQL_USB_SERIAL,
260     NM_USB_IDX_COUNT
261 };
262 
263 #endif /* NM_DATABASE_H_ */
264 /* vim:set ts=4 sw=4: */
265