YATISH
Yet Another TIme SHeet
/home/nicolas/sources/yatish/yatishDBmysql.cpp
Go to the documentation of this file.
1 /***************************************************************
2  * Name: yatishDBmysql.cpp
3  * Purpose: Code for the mysql controller
4  * Author: Nicolas PĂ©renne (nicolas.perenne@eif-services.eu)
5  * Created: 2020-04-16
6  * Copyright: EIF-services (https://www.eif-services.eu)
7  * License: GPLv3
8  **************************************************************/
9 
10 #include "wx_pch.h"
11 #include "yatishDBmysql.h"
12 
13 #undef CATCH // avoids a warning before redefining
14 #define CATCH(returnValue) catch (wxDatabaseException& e) {\
15  errorCode = e.GetErrorCode();\
16  wxLogError ( "[%d] %s", errorCode, e.GetErrorMessage() );\
17  return returnValue; }
18 
19 wxDatabase * yatishDBmysql::slaveDB = nullptr;
20 
28  wxASSERT_MSG (slaveDB == nullptr, "There can be only one instance of yatishDBmysql.");
29  slaveDB = GetDatabase ("");
30  if (!slaveDB) return;
31  try {
32  if (slaveDB->GetTypeName() != "MYSQL")
33  throw ( wxDatabaseException (-4, _("Slave DB must be MySQL") ) );
34  if ( !TablesOk (slaveDB) && !NewTables() )
35  throw ( wxDatabaseException (-5, _("Yatish tables not created (MySQL)") ) );
36  }
37  catch (wxDatabaseException& e) {
38  wxLogError ( "[%d] %s", e.GetErrorCode(), e.GetErrorMessage() );
39  slaveDB->Close();
40  delete slaveDB;
41  slaveDB = nullptr;
42  }
43  errorCode = 0;
44 }
45 
51  if (!slaveDB) return false;
52  try {
53  if ( slaveDB->TableExists ("yatish_client") )
54  slaveDB->RunQuery ("DELETE FROM yatish_client;");
55  else
56  slaveDB->RunQuery ("CREATE TABLE yatish_client ("
57  "id INT NOT NULL AUTO_INCREMENT,"
58  "name VARCHAR (20) NOT NULL UNIQUE,"
59  "PRIMARY KEY (id));");
60  if ( slaveDB->TableExists ("yatish_project") )
61  slaveDB->RunQuery ("DELETE FROM yatish_project;");
62  else
63  slaveDB->RunQuery ("CREATE TABLE yatish_project ("
64  "id INT NOT NULL AUTO_INCREMENT,"
65  "name VARCHAR (20) NOT NULL UNIQUE,"
66  "client_id INT NOT NULL,"
67  "PRIMARY KEY (id),"
68  "FOREIGN KEY (client_id) REFERENCES yatish_client (id)"
69  "ON DELETE CASCADE ON UPDATE CASCADE);");
70  if ( slaveDB->TableExists ("yatish_task") )
71  slaveDB->RunQuery ("DELETE FROM yatish_task;");
72  else
73  slaveDB->RunQuery ("CREATE TABLE yatish_task ("
74  "id INT NOT NULL AUTO_INCREMENT,"
75  "name VARCHAR (20) NOT NULL UNIQUE,"
76  "PRIMARY KEY (id));");
77  if ( slaveDB->TableExists ("yatish_tool") )
78  slaveDB->RunQuery ("DELETE FROM yatish_tool;");
79  else
80  slaveDB->RunQuery ("CREATE TABLE yatish_tool ("
81  "id INT NOT NULL AUTO_INCREMENT,"
82  "name VARCHAR (20) NOT NULL UNIQUE,"
83  "PRIMARY KEY (id));");
84  if ( slaveDB->TableExists ("yatish_activity") )
85  slaveDB->RunQuery ("DELETE FROM yatish_activity;");
86  else
87  slaveDB->RunQuery ("CREATE TABLE yatish_activity ("
88  "id INT NOT NULL AUTO_INCREMENT,"
89  "project_id INT NOT NULL,"
90  "task_id INT NOT NULL,"
91  "tool_id INT NOT NULL,"
92  "PRIMARY KEY (id),"
93  "UNIQUE (project_id,task_id,tool_id),"
94  "FOREIGN KEY (project_id) REFERENCES yatish_project (id)"
95  "ON DELETE CASCADE ON UPDATE CASCADE,"
96  "FOREIGN KEY (task_id) REFERENCES yatish_task (id)"
97  "ON DELETE CASCADE ON UPDATE CASCADE,"
98  "FOREIGN KEY (tool_id) REFERENCES yatish_tool (id)"
99  "ON DELETE CASCADE ON UPDATE CASCADE);");
100  if ( slaveDB->TableExists ("yatish_timeslot") )
101  slaveDB->RunQuery ("DELETE FROM yatish_timeslot;");
102  else
103  slaveDB->RunQuery ("CREATE TABLE yatish_timeslot ("
104  "id INT NOT NULL AUTO_INCREMENT,"
105  "start DATETIME,"
106  "stop DATETIME,"
107  "activity_id INT NOT NULL,"
108  "PRIMARY KEY (id),"
109  "FOREIGN KEY (activity_id) REFERENCES yatish_activity (id)"
110  "ON DELETE CASCADE ON UPDATE CASCADE);");
111  }
112  CATCH (false);
113  return true;
114 }
115 
117  if (!slaveDB) return;
118  slaveDB->Close();
119  delete slaveDB;
120  slaveDB = nullptr;
121 }
122 
128  if (!slaveDB || !masterDB) return 0;
131  Delete();
132  return errorCode;
133 }
134 
140  if (!slaveDB || !masterDB) return 0;
144  return errorCode;
145 }
146 
152  if (!slaveDB || !masterDB) return 0;
155  return errorCode;
156 }
157 
163  if (!slaveDB) return false;
164  try {
165  slaveDB->RunQuery ("DELETE FROM yatish_client;");
166  slaveDB->RunQuery ("DELETE FROM yatish_project;");
167  slaveDB->RunQuery ("DELETE FROM yatish_task;");
168  slaveDB->RunQuery ("DELETE FROM yatish_tool;");
169  slaveDB->RunQuery ("DELETE FROM yatish_activity;");
170  slaveDB->RunQuery ("DELETE FROM yatish_timeslot;");
171  }
172  CATCH (false);
173  errorCode = 0;
174  return true;
175 }
176 
182  if (!masterDB) return false;
183  try {
184  masterDB->RunQuery ("DELETE FROM yatish_client;");
185  masterDB->RunQuery ("DELETE FROM yatish_project;");
186  masterDB->RunQuery ("DELETE FROM yatish_task;");
187  masterDB->RunQuery ("DELETE FROM yatish_tool;");
188  masterDB->RunQuery ("DELETE FROM yatish_activity;");
189  masterDB->RunQuery ("DELETE FROM yatish_timeslot;");
190  }
191  CATCH (false);
192  errorCode = 0;
193  return true;
194 }
195 
201  if (!masterDB) return false;
202  try {
203  masterDB->RunQuery ("UPDATE yatish_client SET sync='I';");
204  masterDB->RunQuery ("UPDATE yatish_project SET sync='I';");
205  masterDB->RunQuery ("UPDATE yatish_task SET sync='I';");
206  masterDB->RunQuery ("UPDATE yatish_tool SET sync='I';");
207  masterDB->RunQuery ("UPDATE yatish_activity SET sync='I';");
208  masterDB->RunQuery ("UPDATE yatish_timeslot SET sync='I';");
209  }
210  CATCH (false);
211  errorCode = 0;
212  return true;
213 }
214 
222  if (!slaveDB || !masterDB) return false;
223  wxString sql;
224  long id;
225  for (int i = 0; i < 6; i++) {
226  try {
227  const char * n = tableName[i];
228  sql.Printf("SELECT id FROM yatish_%s WHERE sync = 'D';", n);
229  wxDatabaseResultSet * results = masterDB->RunQueryWithResults (sql);
230  while ( results->Next() ) {
231  id = results->GetResultLong (1);
232  sql.Printf ("DELETE FROM yatish_%s WHERE id = %ld;", n, id);
233  slaveDB->RunQuery (sql);
234  masterDB->RunQuery (sql);
235  }
236  masterDB->CloseResultSet (results);
237  }
238  CATCH (false)
239  }
240  errorCode = 0;
241  return true;
242 }
243 
253  if (!slaveDB || !masterDB) return false;
254  wxString sql, name;
255  long id;
256  for (int i = 0; i < 3; i++) {
257  try {
258  const char * n = tableName[i];
259  sql.Printf("SELECT id,name FROM yatish_%s WHERE sync = 'I';", n);
260  wxDatabaseResultSet * results = masterDB->RunQueryWithResults (sql);
261  while ( results->Next() ) {
262  id = results->GetResultLong (1);
263  name = results->GetResultString (2);
264  sql.Printf ("INSERT INTO yatish_%s (id,name) VALUES (%ld,'%s');", n, id, name);
265  slaveDB->RunQuery (sql);
266  sql.Printf ("UPDATE yatish_%s SET sync='S' WHERE id = %ld;", n, id);
267  masterDB->RunQuery (sql);
268  }
269  masterDB->CloseResultSet (results);
270  }
271  CATCH (false)
272  }
273  errorCode = 0;
274  return true;
275 }
276 
286  if (!slaveDB || !masterDB) return false;
287  wxString sql, name;
288  long id;
289  for (int i = 0; i < 3; i++) {
290  try {
291  const char * n = tableName[i];
292  sql.Printf("SELECT id,name FROM yatish_%s;", n);
293  wxDatabaseResultSet * results = slaveDB->RunQueryWithResults (sql);
294  while ( results->Next() ) {
295  id = results->GetResultLong (1);
296  name = results->GetResultString (2);
297  sql.Printf ("INSERT INTO yatish_%s (id,name,sync) VALUES (%ld,'%s','S');", n, id, name);
298  masterDB->RunQuery (sql);
299  }
300  slaveDB->CloseResultSet (results);
301  }
302  CATCH (false)
303  }
304  errorCode = 0;
305  return true;
306 }
307 
318  if (!slaveDB || !masterDB) return false;
319  wxString sql, name;
320  long id;
321  for (int i = 0; i < 3; i++) {
322  try {
323  const char * n = tableName[i];
324  sql.Printf("SELECT id,name FROM yatish_%s WHERE sync = 'U';", n);
325  wxDatabaseResultSet * results = masterDB->RunQueryWithResults (sql);
326  while ( results->Next() ) {
327  id = results->GetResultLong (1);
328  name = results->GetResultString (2);
329  sql.Printf ("UPDATE yatish_%s SET name='%s' WHERE id = %ld;", n, name, id);
330  slaveDB->RunQuery (sql);
331  sql.Printf ("UPDATE yatish_%s SET sync='S' WHERE id = %ld;", n, id);
332  masterDB->RunQuery (sql);
333  }
334  masterDB->CloseResultSet (results);
335  }
336  CATCH (false)
337  }
338  errorCode = 0;
339  return true;
340 }
341 
347  if (!slaveDB || !masterDB) return false;
348  wxString sql, name;
349  long id, client_id;
350  try {
351  sql.Printf("SELECT id,name,client_id FROM yatish_project WHERE sync = 'I';");
352  wxDatabaseResultSet * results = masterDB->RunQueryWithResults (sql);
353  while ( results->Next() ) {
354  id = results->GetResultLong (1);
355  name = results->GetResultString (2);
356  client_id = results->GetResultLong (3);
357  sql.Printf ("INSERT INTO yatish_project (id,name,client_id)"
358  " VALUES (%ld,'%s',%ld);", id, name, client_id);
359  slaveDB->RunQuery (sql);
360  sql.Printf ("UPDATE yatish_project SET sync='S' WHERE id = %ld;", id);
361  masterDB->RunQuery (sql);
362  }
363  masterDB->CloseResultSet (results);
364  }
365  CATCH (false)
366  errorCode = 0;
367  return true;
368 }
369 
375  if (!slaveDB || !masterDB) return false;
376  wxString sql, name;
377  long id, client_id;
378  try {
379  sql.Printf("SELECT id,name,client_id FROM yatish_project;");
380  wxDatabaseResultSet * results = slaveDB->RunQueryWithResults (sql);
381  while ( results->Next() ) {
382  id = results->GetResultLong (1);
383  name = results->GetResultString (2);
384  client_id = results->GetResultLong (3);
385  sql.Printf ("INSERT INTO yatish_project (id,name,client_id,sync)"
386  " VALUES (%ld,'%s',%ld,'S');", id, name, client_id);
387  masterDB->RunQuery (sql);
388  }
389  slaveDB->CloseResultSet (results);
390  }
391  CATCH (false)
392  errorCode = 0;
393  return true;
394 }
395 
401  if (!slaveDB || !masterDB) return false;
402  wxString sql, name;
403  long id, client_id;
404  try {
405  sql.Printf("SELECT id,name,client_id FROM yatish_project WHERE sync = 'U';");
406  wxDatabaseResultSet * results = masterDB->RunQueryWithResults (sql);
407  while ( results->Next() ) {
408  id = results->GetResultLong (1);
409  name = results->GetResultString (2);
410  client_id = results->GetResultLong (3);
411  sql.Printf ("UPDATE yatish_project SET name='%s',client_id=%ld"
412  " WHERE id = %ld;", name, client_id, id);
413  slaveDB->RunQuery (sql);
414  sql.Printf ("UPDATE yatish_project SET sync='S' WHERE id = %ld;", id);
415  masterDB->RunQuery (sql);
416  }
417  masterDB->CloseResultSet (results);
418  }
419  CATCH (false)
420  errorCode = 0;
421  return true;
422 }
423 
429  if (!slaveDB || !masterDB) return false;
430  wxString sql;
431  long id1, id2, id3, id4;
432  try {
433  sql.Printf("SELECT id,project_id,task_id,tool_id FROM yatish_activity WHERE sync = 'I';");
434  wxDatabaseResultSet * results = masterDB->RunQueryWithResults (sql);
435  while ( results->Next() ) {
436  id1 = results->GetResultLong (1);
437  id2 = results->GetResultLong (2);
438  id3 = results->GetResultLong (3);
439  id4 = results->GetResultLong (4);
440  sql.Printf ("INSERT INTO yatish_activity (id,project_id,task_id,tool_id)"
441  " VALUES (%ld,%ld,%ld,%ld);", id1, id2, id3, id4);
442  slaveDB->RunQuery (sql);
443  sql.Printf ("UPDATE yatish_activity SET sync='S' WHERE id = %ld;", id1);
444  masterDB->RunQuery (sql);
445  }
446  masterDB->CloseResultSet (results);
447  }
448  CATCH (false)
449  errorCode = 0;
450  return true;
451 }
452 
458  if (!slaveDB || !masterDB) return false;
459  wxString sql;
460  long id1, id2, id3, id4;
461  try {
462  sql.Printf("SELECT id,project_id,task_id,tool_id FROM yatish_activity;");
463  wxDatabaseResultSet * results = slaveDB->RunQueryWithResults (sql);
464  while ( results->Next() ) {
465  id1 = results->GetResultLong (1);
466  id2 = results->GetResultLong (2);
467  id3 = results->GetResultLong (3);
468  id4 = results->GetResultLong (4);
469  sql.Printf ("INSERT INTO yatish_activity (id,project_id,task_id,tool_id,sync)"
470  " VALUES (%ld,%ld,%ld,%ld,'S');", id1, id2, id3, id4);
471  masterDB->RunQuery (sql);
472  }
473  slaveDB->CloseResultSet (results);
474  }
475  CATCH (false)
476  errorCode = 0;
477  return true;
478 }
479 
485  if (!slaveDB || !masterDB) return false;
486  wxString sql;
487  long id1, id2, id3, id4;
488  try {
489  sql.Printf("SELECT id,project_id,task_id,tool_id FROM yatish_activity WHERE sync = 'U';");
490  wxDatabaseResultSet * results = masterDB->RunQueryWithResults (sql);
491  while ( results->Next() ) {
492  id1 = results->GetResultLong (1);
493  id2 = results->GetResultLong (2);
494  id3 = results->GetResultLong (3);
495  id4 = results->GetResultLong (4);
496  sql.Printf ("UPDATE yatish_activity SET project_id=%ld,task_id=%ld,tool_id=%ld"
497  " WHERE id = %ld;", id2, id3, id4, id1);
498  slaveDB->RunQuery (sql);
499  sql.Printf ("UPDATE yatish_activity SET sync='S' WHERE id = %ld;", id1);
500  masterDB->RunQuery (sql);
501  }
502  masterDB->CloseResultSet (results);
503  }
504  CATCH (false)
505  errorCode = 0;
506  return true;
507 }
508 
514  if (!slaveDB || !masterDB) return false;
515  wxString sql, start, stop;
516  long id, activity_id;
517  try {
518  sql.Printf("SELECT id,start,stop,activity_id FROM yatish_timeslot WHERE sync = 'I';");
519  wxDatabaseResultSet * results = masterDB->RunQueryWithResults (sql);
520  while ( results->Next() ) {
521  id = results->GetResultLong (1);
522  start = results->GetResultString (2);
523  stop = results->GetResultString (3);
524  activity_id = results->GetResultLong (4);
525  sql.Printf ("INSERT INTO yatish_timeslot (id,start,stop,activity_id)"
526  " VALUES (%ld,'%s','%s',%ld);", id, start, stop, activity_id);
527  slaveDB->RunQuery (sql);
528  sql.Printf ("UPDATE yatish_timeslot SET sync='S' WHERE id = %ld;", id);
529  masterDB->RunQuery (sql);
530  }
531  masterDB->CloseResultSet (results);
532  }
533  CATCH (false)
534  errorCode = 0;
535  return true;
536 }
537 
543  if (!slaveDB || !masterDB) return false;
544  wxString sql, start, stop;
545  long id, activity_id;
546  try {
547  sql.Printf("SELECT id,start,stop,activity_id FROM yatish_timeslot;");
548  wxDatabaseResultSet * results = slaveDB->RunQueryWithResults (sql);
549  while ( results->Next() ) {
550  id = results->GetResultLong (1);
551  start = results->GetResultDate (2) .FormatISOCombined (' ');
552  stop = results->GetResultDate (3) .FormatISOCombined (' ');
553  activity_id = results->GetResultLong (4);
554  sql.Printf ("INSERT INTO yatish_timeslot (id,start,stop,activity_id,sync)"
555  " VALUES (%ld,'%s','%s',%ld,'S');", id, start, stop, activity_id);
556  masterDB->RunQuery (sql);
557  }
558  slaveDB->CloseResultSet (results);
559  }
560  CATCH (false)
561  errorCode = 0;
562  return true;
563 }
564 
570  if (!slaveDB || !masterDB) return false;
571  wxString sql, start, stop;
572  long id, activity_id;
573  try {
574  sql.Printf("SELECT id,start,stop,activity_id FROM yatish_timeslot WHERE sync = 'U';");
575  wxDatabaseResultSet * results = masterDB->RunQueryWithResults (sql);
576  while ( results->Next() ) {
577  id = results->GetResultLong (1);
578  start = results->GetResultString (2);
579  stop = results->GetResultString (3);
580  activity_id = results->GetResultLong (4);
581  sql.Printf ("UPDATE yatish_timeslot SET start='%s',stop='%s',activity_id=%ld"
582  " WHERE id = %ld;", start, stop, activity_id, id);
583  slaveDB->RunQuery (sql);
584  sql.Printf ("UPDATE yatish_timeslot SET sync='S' WHERE id = %ld;", id);
585  masterDB->RunQuery (sql);
586  }
587  masterDB->CloseResultSet (results);
588  }
589  CATCH (false)
590  errorCode = 0;
591  return true;
592 }
bool EmptySlaveTables()
Empties all yatish tables in slaveDB.
bool Delete()
Takes care of DELETEs in yatish tables.
bool DownloadActivity()
Downloads yatish_activity.
bool DownloadProject()
Downloads yatish_project.
#define CATCH(returnValue)
int Download()
Downloads slaveDB into masterDB.
bool UpdateTimeslot()
Takes care of UPDATEs in yatish_timeslot.
wxDatabase * GetDatabase(const wxString &)
Sets up a (configuration) flux using its argument then calls wxDatabase::GetDatabase().
Definition: yatishDB.cpp:47
static wxDatabase * masterDB
Definition: yatishDB.h:53
yatishDBmysql()
Mainly connects to the MySQL database specified in yatish.auth
bool InsertActivity()
Takes care of INSERTs in yatish_activity.
bool TablesOk(wxDatabase *)
Returns false if any of the yatish table is missings.
Definition: yatishDB.cpp:82
bool OutdateMasterTables()
Sets the sync field to &#39;I&#39; in all records of all yatish tables in masterDB.
bool Update()
Takes care of UPDATEs in yatish tables with a single name column.
bool InsertProject()
Takes care of INSERTs in yatish_project.
bool EmptyMasterTables()
Empties all yatish tables in masterDB.
bool UpdateProject()
Takes care of UPDATEs in yatish_project.
int Upload()
Uploads masterDB into slaveDB.
static wxDatabase * slaveDB
Definition: yatishDBmysql.h:28
bool DownloadNames()
Downloads yatish tables with a single name column.
bool UpdateActivity()
Takes care of UPDATEs in yatish_activity.
int Commit()
Updates slaveDB with records of masterDB where the sync field is not &#39;S&#39;.
bool Insert()
Takes care of INSERTs in yatish tables with a single name column.
bool NewTables()
Creates the yatish tables.
static const char * tableName[]
Must be defined in the same order as enum tableID.
Definition: yatishDB.h:51
bool InsertTimeslot()
Takes care of INSERTs in yatish_timeslot.
bool DownloadTimeslot()
Download yatish_timeslot.