dbpilots.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. /*
  2. *openPilot Log - A FOSS Pilot Logbook Application
  3. *Copyright (C) 2020 Felix Turowsky
  4. *
  5. *This program is free software: you can redistribute it and/or modify
  6. *it under the terms of the GNU General Public License as published by
  7. *the Free Software Foundation, either version 3 of the License, or
  8. *(at your option) any later version.
  9. *
  10. *This program is distributed in the hope that it will be useful,
  11. *but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. *GNU General Public License for more details.
  14. *
  15. *You should have received a copy of the GNU General Public License
  16. *along with this program. If not, see <https://www.gnu.org/licenses/>.
  17. */
  18. #include "dbpilots.h"
  19. #include "dbapi.h"
  20. /*!
  21. * \brief RetreivePilotNameFromID Looks up pilot ID in database
  22. * \param pilotID pilot_id in database
  23. * \return Pilot Name
  24. */
  25. QString dbPilots::retreivePilotNameFromID(QString pilotID)
  26. {
  27. QString pilotName("");
  28. if (pilotID == "1")
  29. {
  30. pilotName = "self";
  31. return pilotName;
  32. }
  33. QSqlQuery query;
  34. query.prepare("SELECT piclastname, picfirstname, alias FROM pilots WHERE pilot_id == ?");
  35. query.addBindValue(pilotID.toInt());
  36. query.exec();
  37. while (query.next()) {
  38. pilotName.append(query.value(0).toString());
  39. pilotName.append(", ");
  40. pilotName.append(query.value(1).toString());//.left(1));
  41. }
  42. if(pilotName.length() == 0)
  43. {
  44. qDebug() << ("No Pilot with this ID found");
  45. }
  46. return pilotName;
  47. }
  48. /*!
  49. * \brief dbPilots::retreivePilotIdFromString Looks up a pilot in the database
  50. * \param lastname pic_lastname in pilots table
  51. * \param firstname pic_firstname in pilots table
  52. * \return pilot_id from database or empty string.
  53. */
  54. QString dbPilots::retreivePilotIdFromString(QString lastname, QString firstname)
  55. {
  56. QSqlQuery query;
  57. query.prepare("SELECT pilot_id from pilots "
  58. "WHERE piclastname = ? AND picfirstname LIKE ?");
  59. query.addBindValue(lastname);
  60. firstname.prepend("%"); firstname.append("%");
  61. query.addBindValue(firstname);
  62. query.exec();
  63. QString id;
  64. if(query.first()){id.append(query.value(0).toString());}
  65. return id;
  66. }
  67. /*!
  68. * \brief dbPilots::retreivePilotNameFromString Searches the pilot Name
  69. * in the Database and returns the name as a vector of results unless the pilot in command is the logbook owner.
  70. * \param searchstring
  71. * \return
  72. */
  73. QStringList dbPilots::retreivePilotNameFromString(QString searchstring)
  74. {
  75. QString firstname = searchstring; //To Do: Two control paths, one for single word, query as before with only searchstring
  76. QString lastname = searchstring; // second control path with comma, lastname like AND firstname like
  77. if(searchstring.contains(QLatin1Char(',')))
  78. {
  79. QStringList namelist = searchstring.split(QLatin1Char(','));
  80. QString lastname = namelist[0].trimmed();
  81. lastname = lastname.toLower();
  82. lastname[0] = lastname[0].toUpper();
  83. lastname.prepend("%"), lastname.append("%");
  84. QString firstname = namelist[1].trimmed();
  85. if(firstname.length()>1)
  86. {
  87. firstname = firstname.toLower();
  88. firstname[0] = firstname[0].toUpper();
  89. firstname.prepend("%"), firstname.append("%");
  90. }
  91. qDebug() << "db::RetreivePilotNameFromString: first last after comma";
  92. qDebug() << firstname << lastname;
  93. }
  94. QSqlQuery query;
  95. query.prepare("SELECT piclastname, picfirstname, alias "
  96. "FROM pilots WHERE "
  97. "picfirstname LIKE ? OR piclastname LIKE ? OR alias LIKE ?");
  98. searchstring.prepend("%");
  99. searchstring.append("%");
  100. query.addBindValue(firstname);
  101. query.addBindValue(lastname);
  102. query.addBindValue(searchstring);
  103. query.exec();
  104. QStringList result;
  105. while (query.next()) {
  106. QString piclastname = query.value(0).toString();
  107. QString picfirstname = query.value(1).toString();
  108. QString alias = query.value(2).toString();
  109. QString name = piclastname + ", " + picfirstname;
  110. result.append(name);
  111. }
  112. qDebug() << "db::RetreivePilotNameFromString Result: " << result;
  113. if(result.size() == 0)
  114. {
  115. qDebug() << ("db::RetreivePilotNameFromString: No Pilot found");
  116. return result;
  117. }
  118. return result;
  119. }
  120. /*!
  121. * \brief newPicGetString This function is returning a QStringList for the QCompleter in the NewFlight::newPic line edit
  122. * A regular expression limits the input possibilities to only characters,
  123. * followed by an optional ',' and 1 whitespace, e.g.:
  124. * Miller, Jim ->valid / Miller, Jim -> invalid / Miller,, Jim -> invalid
  125. * Miller Jim -> valid / Miller Jim ->invalid
  126. * Jim Miller-> valid
  127. * \param searchstring
  128. * \return
  129. */
  130. QStringList dbPilots::newPicGetString(QString searchstring)
  131. {
  132. qWarning() << "newPicGetString is deprecated";
  133. QStringList result;
  134. QStringList searchlist;
  135. if(searchstring == "self")
  136. {
  137. result.append("self");
  138. qDebug() << "Pilot is self";
  139. return result;
  140. }
  141. //Case 1) Lastname, Firstname
  142. if(searchstring.contains(QLatin1Char(',')))
  143. {
  144. QStringList namelist = searchstring.split(QLatin1Char(','));
  145. QString name1 = namelist[0].trimmed();
  146. name1 = name1.toLower();
  147. name1[0] = name1[0].toUpper();
  148. searchlist.append(name1);
  149. if(namelist[1].length() > 1)
  150. {
  151. QString name2 = namelist[1].trimmed();
  152. name2 = name2.toLower();
  153. name2[0] = name2[0].toUpper();
  154. searchlist.append(name2);
  155. }
  156. }
  157. //Case 2: Firstname Lastname
  158. if(searchstring.contains(" ") && !searchstring.contains(QLatin1Char(',')))
  159. {
  160. QStringList namelist = searchstring.split(" ");
  161. QString name1 = namelist[0].trimmed();
  162. name1 = name1.toLower();
  163. name1[0] = name1[0].toUpper();
  164. searchlist.append(name1);
  165. if(namelist[1].length() > 1) //To avoid index out of range if the searchstring is one word followed by only one whitespace
  166. {
  167. QString name2 = namelist[1].trimmed();
  168. name2 = name2.toLower();
  169. name2[0] = name2[0].toUpper();
  170. searchlist.append(name2);
  171. }
  172. }
  173. //Case 3: Lastname
  174. if(!searchstring.contains(" ") && !searchstring.contains(QLatin1Char(',')))
  175. {
  176. QString name1 = searchstring.toLower();
  177. name1[0] = name1[0].toUpper();
  178. searchlist.append(name1);
  179. }
  180. if(searchlist.length() == 1)
  181. {
  182. QSqlQuery query;
  183. query.prepare("SELECT piclastname, picfirstname FROM pilots "
  184. "WHERE piclastname LIKE ?");
  185. query.addBindValue(searchlist[0] + '%');
  186. query.exec();
  187. while(query.next())
  188. {
  189. result.append(query.value(0).toString() + ", " + query.value(1).toString());
  190. }
  191. QSqlQuery query2;
  192. query2.prepare("SELECT piclastname, picfirstname FROM pilots "
  193. "WHERE picfirstname LIKE ?");
  194. query2.addBindValue(searchlist[0] + '%');
  195. query2.exec();
  196. while(query2.next())
  197. {
  198. result.append(query2.value(0).toString() + ", " + query2.value(1).toString());
  199. }
  200. }else
  201. {
  202. QSqlQuery query;
  203. query.prepare("SELECT piclastname, picfirstname FROM pilots "
  204. "WHERE piclastname LIKE ? AND picfirstname LIKE ?");
  205. query.addBindValue(searchlist[0] + '%');
  206. query.addBindValue(searchlist[1] + '%');
  207. query.exec();
  208. while(query.next())
  209. {
  210. result.append(query.value(0).toString() + ", " + query.value(1).toString());
  211. }
  212. QSqlQuery query2;
  213. query2.prepare("SELECT piclastname, picfirstname FROM pilots "
  214. "WHERE picfirstname LIKE ? AND piclastname LIKE ?");
  215. query2.addBindValue(searchlist[0] + '%');
  216. query2.addBindValue(searchlist[1] + '%');
  217. query2.exec();
  218. while(query2.next())
  219. {
  220. result.append(query2.value(0).toString() + ", " + query2.value(1).toString());
  221. }
  222. }
  223. qDebug() << "db::newPic Result" << result.length() << result;
  224. if(result.length() == 0)
  225. {
  226. //To Do: try first name search
  227. qDebug() << "No Pilot with this name found";
  228. return result;
  229. }else
  230. {
  231. return result;
  232. }
  233. }
  234. QStringList dbPilots::retreivePilotList()
  235. {
  236. QSqlQuery query;
  237. query.prepare("SELECT piclastname, picfirstname FROM pilots");
  238. query.exec();
  239. QStringList result;
  240. while (query.next()) {
  241. result.append(query.value(0).toString() + ", " + query.value(1).toString());
  242. }
  243. return result;
  244. }
  245. QString dbPilots::newPicGetId(QString name)
  246. {
  247. QString result;
  248. QStringList nameparts = name.split(QLatin1Char(','));
  249. QString lastname = nameparts[0].trimmed();
  250. lastname = lastname.toLower(); lastname[0] = lastname[0].toUpper();
  251. QString firstname = nameparts[1].trimmed();
  252. firstname = firstname.toLower(); firstname[0] = firstname[0].toUpper();
  253. firstname.prepend("%"); firstname.append("%");
  254. QSqlQuery query;
  255. query.prepare("SELECT pilot_id FROM pilots "
  256. "WHERE piclastname = ? AND picfirstname LIKE ?");
  257. query.addBindValue(lastname);
  258. query.addBindValue(firstname);
  259. query.exec();
  260. while (query.next())
  261. {
  262. result.append(query.value(0).toString());
  263. }
  264. qDebug() << "newPicGetId: result = " << result;
  265. return result;
  266. }
  267. bool dbPilots::verifyPilotExists(QStringList names)
  268. {
  269. QString name0;
  270. QString name1;
  271. if (!names.isEmpty()){
  272. if(names.length() == 1){ //only lastname
  273. name0 = names[0].trimmed();
  274. }else if (names.length() == 2){ //firstname and lastname
  275. name0 = names[0].trimmed();
  276. name1 = names[1].trimmed();
  277. }
  278. }else{
  279. qWarning() << __func__ << "Invalid Input. Aborting.";
  280. return false;
  281. }
  282. QSqlQuery query;
  283. if(names.length() == 1){ //only lastname
  284. query.prepare("SELECT pilot_id FROM pilots "
  285. "WHERE piclastname = ?");
  286. query.addBindValue(name0);
  287. }else if (names.length() == 2){ //firstname and lastname
  288. query.prepare("SELECT pilot_id FROM pilots "
  289. "WHERE piclastname = ? AND picfirstname = ? "
  290. "OR picfirstname = ? AND piclastname = ? ");
  291. query.addBindValue(name0);
  292. query.addBindValue(name1);
  293. query.addBindValue(name0);
  294. query.addBindValue(name1);
  295. }
  296. query.exec();
  297. if(query.first()){
  298. qDebug() << __func__ << "Pilot found: " << name0;
  299. return true;
  300. }else{
  301. qDebug() << __func__ << "No Pilot found";
  302. return false;
  303. }
  304. }