parkspace_db_manager.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. /*
  2. * @Description: 车位数据库管理
  3. * @Author: yct
  4. * @Date: 2020-07-19 09:57:45
  5. * @LastEditTime: 2020-09-11 11:41:09
  6. * @LastEditors: yct
  7. */
  8. #include "parkspace_db_manager.h"
  9. Parkspace_db_manager::Parkspace_db_manager()
  10. {
  11. mb_initialized=false;
  12. }
  13. Parkspace_db_manager::~Parkspace_db_manager()
  14. {
  15. Parkspace_db_manager_uninit();
  16. }
  17. // 车位数据库管理初始化
  18. Error_manager Parkspace_db_manager::Parkspace_db_manager_init(parkspace_proto::database_config config)
  19. {
  20. Error_manager ec = SUCCESS;
  21. ec = m_db_controller.database_controller_init(config.db_ip(), config.db_port(), config.db_username(), config.db_passwd(), config.db_name(), config.db_conn_pool_size());
  22. mb_initialized = true;
  23. return ec;
  24. }
  25. // 车位数据库管理反初始化
  26. Error_manager Parkspace_db_manager::Parkspace_db_manager_uninit()
  27. {
  28. mb_initialized=false;
  29. return POINTER_IS_NULL;
  30. }
  31. // 连接状态
  32. bool Parkspace_db_manager::is_connected()
  33. {
  34. mb_connected = m_db_controller.is_connected();
  35. return mb_connected;
  36. }
  37. // 初始化状态
  38. bool Parkspace_db_manager::is_initialized()
  39. {
  40. return mb_initialized;
  41. }
  42. // 从数据库获得所有车位信息,用于车位模块初始化
  43. Error_manager Parkspace_db_manager::get_all_parkspace_info(message::Parkspace_allocation_status_msg &all_parkspace_info)
  44. {
  45. // 基本条件判断
  46. if(!mb_initialized)
  47. {
  48. return DB_UNINITIALIZED;
  49. }
  50. //执行sql操作
  51. std::string get_all_space_sql = "select * from parkingspace";
  52. boost::shared_ptr<sql::ResultSet> tp_result = nullptr;
  53. Error_manager ec = m_db_controller.sql_query(get_all_space_sql, tp_result);
  54. if(ec == SUCCESS)
  55. {
  56. if(tp_result == nullptr)
  57. {
  58. return DB_RESULT_SET_EMPTY;
  59. }
  60. all_parkspace_info.clear_parkspace_info();
  61. while (tp_result->next())
  62. {
  63. message::Parkspace_info *t_parkspace = all_parkspace_info.add_parkspace_info();
  64. char buf[1024];
  65. memset(buf, 0, 1024);
  66. try
  67. {
  68. t_parkspace->set_parkspace_id(tp_result->getInt("parkingSpaceID"));
  69. t_parkspace->set_index(tp_result->getInt("parkingSpaceX"));
  70. if (tp_result->getInt("parkingSpaceY") > 0)
  71. {
  72. t_parkspace->set_direction(message::Direction::eForward);
  73. }
  74. else
  75. {
  76. t_parkspace->set_direction(message::Direction::eBackward);
  77. }
  78. t_parkspace->set_floor(tp_result->getInt("parkingSpaceZ"));
  79. switch (tp_result->getInt("parkingSpaceState"))
  80. {
  81. case 0:
  82. t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_empty);
  83. break;
  84. case 1:
  85. t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_occupied);
  86. break;
  87. case 2:
  88. t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_reserved);
  89. break;
  90. case 3:
  91. t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_locked);
  92. break;
  93. case 4:
  94. t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_error);
  95. break;
  96. default:
  97. t_parkspace->set_parkspace_status(message::Parkspace_status::eParkspace_error);
  98. break;
  99. }
  100. t_parkspace->set_block_id(tp_result->getInt("parkingSpaceBlockID"));
  101. t_parkspace->set_width(tp_result->getDouble("parkSpaceWidth"));
  102. t_parkspace->set_height(tp_result->getDouble("parkSpaceHeight"));
  103. t_parkspace->mutable_car_info()->set_license(tp_result->getString("parkSpaceCarLicense"));
  104. t_parkspace->mutable_car_info()->set_car_length(tp_result->getDouble("parkSpaceCarLength"));
  105. t_parkspace->mutable_car_info()->set_car_width(tp_result->getDouble("parkSpaceCarWidth"));
  106. t_parkspace->mutable_car_info()->set_car_height(tp_result->getDouble("parkSpaceCarHeight"));
  107. t_parkspace->set_entry_time(tp_result->getString("entryTime"));
  108. t_parkspace->set_leave_time(tp_result->getString("leaveTime"));
  109. }
  110. catch (sql::SQLException &e)
  111. {
  112. // Use what() (derived from std::runtime_error) to fetch the error message
  113. sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str());
  114. return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
  115. }
  116. catch (std::runtime_error &e)
  117. {
  118. sprintf(buf, "# ERR: %s\n ERR: runtime_error in %s ", e.what(), __FILE__);
  119. return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
  120. }
  121. }
  122. return SUCCESS;
  123. }
  124. else
  125. {
  126. return ec;
  127. }
  128. }
  129. // 更新数据库中所有车位信息
  130. Error_manager Parkspace_db_manager::update_all_parkspace_info(message::Parkspace_allocation_status_msg all_parkspace_info)
  131. {
  132. return SUCCESS;
  133. }
  134. // 更新数据库中车位状态
  135. Error_manager Parkspace_db_manager::update_parkspace_status(message::Parkspace_info parkspace_info)
  136. {
  137. // 基本条件判断
  138. if(!mb_initialized)
  139. {
  140. return DB_UNINITIALIZED;
  141. }
  142. //执行sql操作
  143. char update_space_sql[1024];
  144. memset(update_space_sql, 0, 1024);
  145. int status = -1;
  146. switch (parkspace_info.parkspace_status())
  147. {
  148. case message::Parkspace_status::eParkspace_empty:
  149. status = 0;
  150. break;
  151. case message::Parkspace_status::eParkspace_occupied:
  152. status = 1;
  153. break;
  154. case message::Parkspace_status::eParkspace_reserved:
  155. status = 2;
  156. break;
  157. case message::Parkspace_status::eParkspace_locked:
  158. status = 3;
  159. break;
  160. case message::Parkspace_status::eParkspace_error:
  161. status = 4;
  162. break;
  163. default:
  164. break;
  165. }
  166. if(parkspace_info.has_car_info())
  167. {
  168. sprintf(update_space_sql, "update parkingspace set parkingSpaceState = %d,parkSpaceCarLicense = '%s',parkSpaceCarLength = %.3f,parkSpaceCarWidth = %.3f,parkSpaceCarHeight = %.3f,entryTime = '%s',leaveTime = '%s' where parkingSpaceID = %d",
  169. status,
  170. parkspace_info.car_info().license().c_str(),
  171. parkspace_info.car_info().has_car_length()?parkspace_info.car_info().car_length():0.0f,
  172. parkspace_info.car_info().car_width(),
  173. parkspace_info.car_info().car_height(),
  174. parkspace_info.entry_time().c_str(),
  175. parkspace_info.leave_time().c_str(),
  176. parkspace_info.parkspace_id());
  177. }else{
  178. sprintf(update_space_sql, "update parkingspace set parkingSpaceState = %d where parkingSpaceID = %d", status, parkspace_info.parkspace_id());
  179. }
  180. if(status < 0)
  181. return ERROR;
  182. boost::shared_ptr<sql::ResultSet> tp_result = nullptr;
  183. Error_manager ec = m_db_controller.sql_update(update_space_sql);
  184. return ec;
  185. }
  186. // 更新数据库车辆状态,车位信息中包含车辆信息用于匹配更新
  187. Error_manager Parkspace_db_manager::update_vehicle_status(message::Parkspace_info parkspace_info, message::Vehicle_status &vehicle_status)
  188. {
  189. // 基本条件判断
  190. if(!mb_initialized)
  191. {
  192. return DB_UNINITIALIZED;
  193. }
  194. //执行sql操作
  195. if(!parkspace_info.has_car_info())
  196. {
  197. return PARAMETER_ERROR;
  198. }
  199. std::string find_vehicle_sql = std::string("select * from vehicle where numberPlate = '").append(parkspace_info.car_info().license()).append("'");
  200. boost::shared_ptr<sql::ResultSet> query_vehicle_result = nullptr;
  201. m_db_controller.sql_query(find_vehicle_sql, query_vehicle_result);
  202. //判断车辆是否存在
  203. if(query_vehicle_result == nullptr || !query_vehicle_result->next())
  204. {
  205. return insert_vehicle(parkspace_info, vehicle_status);
  206. }else{
  207. char update_vehicle_sql[1024];
  208. memset(update_vehicle_sql, 0, 1024);
  209. int vehicle_status_code = -1;
  210. switch (vehicle_status)
  211. {
  212. case message::Vehicle_status::eVehicle_idle:
  213. vehicle_status_code = 0;
  214. break;
  215. case message::Vehicle_status::eVehicle_in_garage:
  216. vehicle_status_code = 1;
  217. break;
  218. case message::Vehicle_status::eVehicle_parking:
  219. vehicle_status_code = 2;
  220. break;
  221. case message::Vehicle_status::eVehicle_fetching:
  222. vehicle_status_code = 3;
  223. break;
  224. case message::Vehicle_status::eVehicle_reserved:
  225. vehicle_status_code = 4;
  226. break;
  227. default:
  228. break;
  229. }
  230. //车位为空,仅更新车辆状态与长宽高
  231. if(parkspace_info.parkspace_id() <= 0)
  232. {
  233. sprintf(update_vehicle_sql, "update vehicle set vehicleParkState = %d,carLength=%.3f,carWidth=%.3f,carHeight=%.3f where numberPlate = '%s'",
  234. vehicle_status_code,
  235. parkspace_info.car_info().car_length(),
  236. parkspace_info.car_info().car_width(),
  237. parkspace_info.car_info().car_height(),
  238. parkspace_info.car_info().license().c_str());
  239. }
  240. //车位不为空,表示车辆所在车位,同时更新
  241. else
  242. {
  243. sprintf(update_vehicle_sql, "update vehicle set vehicleParkState = %d,carLength=%.3f,carWidth=%.3f,carHeight=%.3f,parkingSpaceID=%d where numberPlate = '%s'",
  244. vehicle_status_code,
  245. parkspace_info.car_info().car_length(),
  246. parkspace_info.car_info().car_width(),
  247. parkspace_info.car_info().car_height(),
  248. parkspace_info.parkspace_id(),
  249. parkspace_info.car_info().license().c_str());
  250. }
  251. if (vehicle_status_code < 0)
  252. return ERROR;
  253. Error_manager ec = m_db_controller.sql_update(update_vehicle_sql);
  254. return ec;
  255. }
  256. }
  257. // 插入车辆
  258. Error_manager Parkspace_db_manager::insert_vehicle(message::Parkspace_info parkspace_info, message::Vehicle_status &vehicle_status)
  259. {
  260. // 基本条件判断
  261. if(!mb_initialized)
  262. {
  263. return DB_UNINITIALIZED;
  264. }
  265. //执行sql操作
  266. if(!parkspace_info.has_car_info())
  267. {
  268. return PARAMETER_ERROR;
  269. }
  270. char insert_vehicle_sql[1024];
  271. memset(insert_vehicle_sql, 0, 1024);
  272. int vehicle_status_code = -1;
  273. switch (vehicle_status)
  274. {
  275. case message::Vehicle_status::eVehicle_idle:
  276. vehicle_status_code = 0;
  277. break;
  278. case message::Vehicle_status::eVehicle_in_garage:
  279. vehicle_status_code = 1;
  280. break;
  281. case message::Vehicle_status::eVehicle_parking:
  282. vehicle_status_code = 2;
  283. break;
  284. case message::Vehicle_status::eVehicle_fetching:
  285. vehicle_status_code = 3;
  286. break;
  287. case message::Vehicle_status::eVehicle_reserved:
  288. vehicle_status_code = 4;
  289. break;
  290. default:
  291. break;
  292. }
  293. //车位为空,仅更新车辆状态与长宽高
  294. if(parkspace_info.parkspace_id() <= 0)
  295. {
  296. sprintf(insert_vehicle_sql, "INSERT INTO vehicle (numberPlate,vehicleParkState,carLength,carWidth,carHeight) values ('%s',%d,%.3f,%.3f,%.3f)",
  297. parkspace_info.car_info().license().c_str(),
  298. vehicle_status_code,
  299. parkspace_info.car_info().car_length(),
  300. parkspace_info.car_info().car_width(),
  301. parkspace_info.car_info().car_height());
  302. }
  303. //车位不为空,表示车辆在车位,同时更新
  304. else
  305. {
  306. sprintf(insert_vehicle_sql, "INSERT INTO vehicle (numberPlate,vehicleParkState,carLength,carWidth,carHeight,parkingSpaceID) values ('%s',%d,%.3f,%.3f,%.3f,%d)",
  307. parkspace_info.car_info().license().c_str(),
  308. vehicle_status_code,
  309. parkspace_info.car_info().car_length(),
  310. parkspace_info.car_info().car_width(),
  311. parkspace_info.car_info().car_height(),
  312. parkspace_info.parkspace_id());
  313. }
  314. if (vehicle_status_code < 0)
  315. return ERROR;
  316. Error_manager ec = m_db_controller.sql_insert(insert_vehicle_sql);
  317. return ec;
  318. }
  319. // 插入停车记录
  320. Error_manager Parkspace_db_manager::insert_parking_record(message::Parkspace_info parkspace_info)
  321. {
  322. // 基本条件判断
  323. if(!mb_initialized)
  324. {
  325. return DB_UNINITIALIZED;
  326. }
  327. //参数中必须包含车辆信息与车位编号
  328. if(!parkspace_info.has_car_info() || parkspace_info.parkspace_id() <= 0)
  329. {
  330. return PARAMETER_ERROR;
  331. }
  332. char insert_parking_record_sql[1024];
  333. memset(insert_parking_record_sql, 0, 1024);
  334. //将车辆号牌,车位ID,记录状态,停车与取车时间写入
  335. sprintf(insert_parking_record_sql, "INSERT INTO parkingrecords (numberPlate,parkingSpaceID,realParkTime) values ('%s',%d,'%s')",
  336. parkspace_info.car_info().license().c_str(),
  337. parkspace_info.parkspace_id(),
  338. parkspace_info.entry_time().c_str());
  339. Error_manager ec = m_db_controller.sql_insert(insert_parking_record_sql);
  340. return ec;
  341. }
  342. // 更新停车记录,待计费系统加入后完善!!!
  343. Error_manager Parkspace_db_manager::update_parking_record(message::Parkspace_info parkspace_info, int record_id)
  344. {
  345. // 基本条件判断
  346. if(!mb_initialized)
  347. {
  348. return DB_UNINITIALIZED;
  349. }
  350. //执行sql操作
  351. if(!parkspace_info.has_car_info() || parkspace_info.parkspace_id() <= 0)
  352. {
  353. return PARAMETER_ERROR;
  354. }
  355. char update_parking_record_sql[1024];
  356. memset(update_parking_record_sql, 0, 1024);
  357. sprintf(update_parking_record_sql, "update parkingrecords set realGetTime='%s',parkingPrice=%d where parkingRecordsID = %d",
  358. parkspace_info.leave_time().c_str(),
  359. 0,
  360. record_id);
  361. Error_manager ec = m_db_controller.sql_update(update_parking_record_sql);
  362. return ec;
  363. }
  364. // 根据车位编号查询车位状态
  365. Error_manager Parkspace_db_manager::query_parkspace(int parkspace_id, message::Parkspace_info &parkspace_info)
  366. {
  367. // 基本条件判断
  368. if(!mb_initialized)
  369. {
  370. return DB_UNINITIALIZED;
  371. }
  372. //执行sql操作
  373. std::string query_parkspace_sql = std::string("select * from parkingspace where parkingSpaceID=").append(std::to_string(parkspace_id));
  374. boost::shared_ptr<sql::ResultSet> tp_result = nullptr;
  375. Error_manager ec = m_db_controller.sql_query(query_parkspace_sql, tp_result);
  376. if(ec == SUCCESS)
  377. {
  378. if(tp_result == nullptr)
  379. {
  380. return DB_RESULT_SET_EMPTY;
  381. }
  382. if (tp_result->next())
  383. {
  384. char buf[1024];
  385. memset(buf, 0, 1024);
  386. try
  387. {
  388. switch (tp_result->getInt("parkingSpaceState"))
  389. {
  390. case 0:
  391. parkspace_info.set_parkspace_status(message::Parkspace_status::eParkspace_empty);
  392. break;
  393. case 1:
  394. parkspace_info.set_parkspace_status(message::Parkspace_status::eParkspace_occupied);
  395. break;
  396. case 2:
  397. parkspace_info.set_parkspace_status(message::Parkspace_status::eParkspace_reserved);
  398. break;
  399. case 3:
  400. parkspace_info.set_parkspace_status(message::Parkspace_status::eParkspace_locked);
  401. break;
  402. case 4:
  403. parkspace_info.set_parkspace_status(message::Parkspace_status::eParkspace_error);
  404. break;
  405. default:
  406. parkspace_info.set_parkspace_status(message::Parkspace_status::eParkspace_error);
  407. break;
  408. }
  409. parkspace_info.set_index(tp_result->getInt("parkingSpaceX"));
  410. parkspace_info.set_direction(tp_result->getInt("parkingSpaceY") > 0 ? message::Direction::eForward : message::Direction::eBackward);
  411. parkspace_info.set_floor(tp_result->getInt("parkingSpaceZ"));
  412. // parkspace_info.set_length();//数据库暂时没有此字段 后续添加再用
  413. parkspace_info.set_width(tp_result->getDouble("parkSpaceWidth"));
  414. parkspace_info.set_height(tp_result->getDouble("parkSpaceheight"));
  415. parkspace_info.mutable_car_info()->set_license(tp_result->getString("parkSpaceCarLicense"));
  416. parkspace_info.mutable_car_info()->set_car_length(tp_result->getDouble("parkSpaceCarLength"));
  417. parkspace_info.mutable_car_info()->set_car_width(tp_result->getDouble("parkSpaceCarWidth"));
  418. parkspace_info.mutable_car_info()->set_car_height(tp_result->getDouble("parkSpaceCarHeight"));
  419. parkspace_info.set_entry_time(tp_result->getString("entryTime"));
  420. parkspace_info.set_leave_time(tp_result->getString("leaveTime"));
  421. }
  422. catch (sql::SQLException &e)
  423. {
  424. /* Use what() (derived from std::runtime_error) to fetch the error message */
  425. sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str());
  426. return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
  427. }
  428. catch (std::runtime_error &e)
  429. {
  430. sprintf(buf, "# ERR: %s\n ERR: runtime_error in %s ", e.what(), __FILE__);
  431. return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
  432. }
  433. }
  434. return SUCCESS;
  435. }
  436. else
  437. {
  438. return ec;
  439. }
  440. }
  441. // 查询车辆状态,暂时不使用
  442. Error_manager Parkspace_db_manager::query_vehicle(std::string license, message::Vehicle_status &vehicle_status, int &park_record_id)
  443. {
  444. // 基本条件判断
  445. if(!mb_initialized)
  446. {
  447. return DB_UNINITIALIZED;
  448. }
  449. //执行sql操作
  450. std::string query_parkspace_sql = std::string("select * from vehicle where numberPlate='").append(license).append("'");
  451. boost::shared_ptr<sql::ResultSet> tp_result = nullptr;
  452. Error_manager ec = m_db_controller.sql_query(query_parkspace_sql, tp_result);
  453. if(ec == SUCCESS)
  454. {
  455. if(tp_result == nullptr)
  456. {
  457. return DB_RESULT_SET_EMPTY;
  458. }
  459. if (tp_result->next())
  460. {
  461. char buf[1024];
  462. memset(buf, 0, 1024);
  463. try
  464. {
  465. switch (tp_result->getInt("vehicleParkState"))
  466. {
  467. case 0:
  468. vehicle_status = message::Vehicle_status::eVehicle_idle;
  469. break;
  470. case 1:
  471. vehicle_status = message::Vehicle_status::eVehicle_in_garage;
  472. break;
  473. case 2:
  474. vehicle_status = message::Vehicle_status::eVehicle_parking;
  475. break;
  476. case 3:
  477. vehicle_status = message::Vehicle_status::eVehicle_fetching;
  478. break;
  479. case 4:
  480. vehicle_status = message::Vehicle_status::eVehicle_reserved;
  481. break;
  482. default:
  483. vehicle_status = message::Vehicle_status::eVehicle_reserved;
  484. break;
  485. }
  486. park_record_id = tp_result->getInt("parkingRecordsID");
  487. }
  488. catch (sql::SQLException &e)
  489. {
  490. /* Use what() (derived from std::runtime_error) to fetch the error message */
  491. sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str());
  492. return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
  493. }
  494. catch (std::runtime_error &e)
  495. {
  496. sprintf(buf, "# ERR: %s\n ERR: runtime_error in %s ", e.what(), __FILE__);
  497. return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
  498. }
  499. }
  500. return SUCCESS;
  501. }
  502. else
  503. {
  504. return ec;
  505. }
  506. }
  507. // 查询停车记录,根据车牌号、车位id查询,反馈停车记录id
  508. Error_manager Parkspace_db_manager::query_parking_record(message::Parkspace_info &parkspace_info, int &record_id)
  509. {
  510. // 基本条件判断
  511. if(!mb_initialized)
  512. {
  513. return DB_UNINITIALIZED;
  514. }
  515. //执行sql操作
  516. if(!parkspace_info.has_car_info() || parkspace_info.parkspace_id() <= 0)
  517. {
  518. return PARAMETER_ERROR;
  519. }
  520. std::string query_park_record_sql = std::string("select * from parkingrecords where numberPlate='").append(parkspace_info.car_info().license()).append("' and parkingSpaceID=").append(std::to_string(parkspace_info.parkspace_id())).append(" ORDER BY parkingRecordsID DESC");
  521. boost::shared_ptr<sql::ResultSet> tp_result = nullptr;
  522. Error_manager ec = m_db_controller.sql_query(query_park_record_sql, tp_result);
  523. if(ec == SUCCESS)
  524. {
  525. if(tp_result == nullptr)
  526. {
  527. return DB_RESULT_SET_EMPTY;
  528. }
  529. if (tp_result->next())
  530. {
  531. char buf[1024];
  532. memset(buf, 0, 1024);
  533. try
  534. {
  535. record_id = tp_result->getInt("parkingRecordsID");
  536. }
  537. catch (sql::SQLException &e)
  538. {
  539. /* Use what() (derived from std::runtime_error) to fetch the error message */
  540. sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str());
  541. return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
  542. }
  543. catch (std::runtime_error &e)
  544. {
  545. sprintf(buf, "# ERR: %s\n ERR: runtime_error in %s ", e.what(), __FILE__);
  546. return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf);
  547. }
  548. }
  549. return SUCCESS;
  550. }
  551. else
  552. {
  553. return ec;
  554. }
  555. }