parkspace_db_manager.cpp 24 KB

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