/* * @Description: 车位数据库管理 * @Author: yct * @Date: 2020-07-19 09:57:45 * @LastEditTime: 2020-07-22 19:07:45 * @LastEditors: yct */ #include "parkspace_operating_function.h" // 从数据库获得所有车位信息,用于车位模块初始化 Error_manager Parkspace_operating_function::get_all_parkspace_info(message::Parkspace_allocation_data_msg &all_parkspace_info) { //执行sql操作 std::string get_all_space_sql = "select * from parkingspace"; boost::shared_ptr tp_result = nullptr; Error_manager ec = Database_controller::get_instance_pointer()->sql_query(get_all_space_sql, tp_result); if(ec == SUCCESS) { if (tp_result == nullptr) { return DB_RESULT_SET_EMPTY; } all_parkspace_info.clear_parkspace_info_ex(); while (tp_result->next()) { message::Parkspace_info *t_parkspace = all_parkspace_info.add_parkspace_info_ex(); char buf[1024]; memset(buf, 0, 1024); try { t_parkspace->set_parkingspace_index_id(tp_result->getInt("parkingSpaceID")); t_parkspace->set_parkingspace_unit_id(tp_result->getInt("parkingspace_unit_id")); t_parkspace->set_parkingspace_room_id(tp_result->getInt("parkingspace_room_id")); if (tp_result->getInt("parkingspace_direction") > 0) { t_parkspace->set_parkingspace_direction(message::Direction::eForward); } else { t_parkspace->set_parkingspace_direction(message::Direction::eBackward); } t_parkspace->set_parkingspace_floor_id(tp_result->getInt("parkingspace_floor_id")); t_parkspace->set_parkingspace_status((message::Parkspace_status)tp_result->getInt("parkingspace_status")); // // switch (tp_result->getInt("parkingspace_status")) // { // case 1: // t_parkspace->set_parkingspace_status(message::Parkspace_status::eParkspace_empty); // break; // case 2: // t_parkspace->set_parkingspace_status(message::Parkspace_status::eParkspace_occupied); // break; // case 3: // t_parkspace->set_parkingspace_status(message::Parkspace_status::eParkspace_reserved); // break; // case 4: // t_parkspace->set_parkingspace_status(message::Parkspace_status::eParkspace_locked); // break; // case 5: // t_parkspace->set_parkingspace_status(message::Parkspace_status::eParkspace_error); // break; // default: // t_parkspace->set_parkingspace_status(message::Parkspace_status::eParkspace_error); // break; // } t_parkspace->set_parkingspace_width(tp_result->getDouble("parkingspace_width")); t_parkspace->set_parkingspace_height(tp_result->getDouble("parkingspace_height")); t_parkspace->mutable_car_info()->set_license(tp_result->getString("parkSpaceCarLicense")); t_parkspace->mutable_car_info()->set_car_length(tp_result->getDouble("parkSpaceCarLength")); t_parkspace->mutable_car_info()->set_car_width(tp_result->getDouble("parkSpaceCarWidth")); t_parkspace->mutable_car_info()->set_car_height(tp_result->getDouble("parkSpaceCarHeight")); t_parkspace->mutable_car_info()->set_car_wheel_base(tp_result->getDouble("parkSpaceCarWheelBase")); t_parkspace->mutable_car_info()->set_car_wheel_width(tp_result->getDouble("parkSpaceCarWheelWidth")); t_parkspace->set_car_type((message::Car_type)tp_result->getInt("parkSpaceCarType")); t_parkspace->set_entry_time(tp_result->getString("entryTime")); t_parkspace->set_leave_time(tp_result->getString("leaveTime")); } catch (sql::SQLException &e) { /* Use what() (derived from std::runtime_error) to fetch the error message */ sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str()); return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf); } catch (std::runtime_error &e) { sprintf(buf, "# ERR: %s\n ERR: runtime_error in %s ", e.what(), __FILE__); return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf); } } return SUCCESS; } else { return ec; } } // 从数据库获得所有指定类型空车位车位信息,用于车位模块初始化 Error_manager Parkspace_operating_function::get_specify_the_type_parkspace_info(message::Parkspace_allocation_data_msg &all_specify_the_type_parkspace_info,int parkspace_type) { //执行sql操作 char all_specify_the_type_sql[1024]; memset(all_specify_the_type_sql, 0, 1024); sprintf(all_specify_the_type_sql,"select * from parkingspace where parkingspace_type= %d and parkingspace_status = 1",parkspace_type); boost::shared_ptr tp_result = nullptr; Error_manager ec = Database_controller::get_instance_pointer()->sql_query(all_specify_the_type_sql, tp_result); if(ec == SUCCESS) { if (tp_result == nullptr) { return DB_RESULT_SET_EMPTY; } all_specify_the_type_parkspace_info.clear_parkspace_info_ex(); while (tp_result->next()) { message::Parkspace_info *t_parkspace = all_specify_the_type_parkspace_info.add_parkspace_info_ex(); char buf[1024]; memset(buf, 0, 1024); try { t_parkspace->set_parkingspace_index_id(tp_result->getInt("parkingSpaceID")); t_parkspace->set_parkingspace_unit_id(tp_result->getInt("parkingspace_unit_id")); t_parkspace->set_parkingspace_room_id(tp_result->getInt("parkingspace_room_id")); if (tp_result->getInt("parkingspace_direction") > 0) { t_parkspace->set_parkingspace_direction(message::Direction::eForward); } else { t_parkspace->set_parkingspace_direction(message::Direction::eBackward); } t_parkspace->set_parkingspace_floor_id(tp_result->getInt("parkingspace_floor_id")); t_parkspace->set_parkingspace_status((message::Parkspace_status)tp_result->getInt("parkingspace_status")); // switch (tp_result->getInt("parkingspace_status")) // { // case 1: // t_parkspace->set_parkingspace_status(message::Parkspace_status::eParkspace_empty); // break; // case 2: // t_parkspace->set_parkingspace_status(message::Parkspace_status::eParkspace_occupied); // break; // case 3: // t_parkspace->set_parkingspace_status(message::Parkspace_status::eParkspace_reserved); // break; // case 4: // t_parkspace->set_parkingspace_status(message::Parkspace_status::eParkspace_locked); // break; // case 5: // t_parkspace->set_parkingspace_status(message::Parkspace_status::eParkspace_error); // break; // default: // t_parkspace->set_parkingspace_status(message::Parkspace_status::eParkspace_error); // break; // } t_parkspace->set_parkingspace_width(tp_result->getDouble("parkingspace_width")); t_parkspace->set_parkingspace_height(tp_result->getDouble("parkingspace_height")); t_parkspace->mutable_car_info()->set_license(tp_result->getString("parkSpaceCarLicense")); t_parkspace->mutable_car_info()->set_car_length(tp_result->getDouble("parkSpaceCarLength")); t_parkspace->mutable_car_info()->set_car_width(tp_result->getDouble("parkSpaceCarWidth")); t_parkspace->mutable_car_info()->set_car_height(tp_result->getDouble("parkSpaceCarHeight")); t_parkspace->set_car_type((message::Car_type)tp_result->getInt("parkSpaceCarType")); t_parkspace->mutable_car_info()->set_car_wheel_base(tp_result->getDouble("parkSpaceCarWheelBase")); t_parkspace->mutable_car_info()->set_car_wheel_width(tp_result->getDouble("parkSpaceCarWheelWidth")); t_parkspace->set_entry_time(tp_result->getString("entryTime")); t_parkspace->set_leave_time(tp_result->getString("leaveTime")); } catch (sql::SQLException &e) { /* Use what() (derived from std::runtime_error) to fetch the error message */ sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str()); return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf); } catch (std::runtime_error &e) { sprintf(buf, "# ERR: %s\n ERR: runtime_error in %s ", e.what(), __FILE__); return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf); } } return SUCCESS; } else { return ec; } } // 清除数据库中所有车位号牌,状态全修改为空闲 Error_manager Parkspace_operating_function::clear_all_parkspace_info() { //执行sql操作 char update_space_sql[1024]; memset(update_space_sql, 0, 1024); sprintf(update_space_sql, "update parkingspace set parkingspace_status = 1,parkSpaceCarLicense = NULL,parkSpaceCarLength = 0,parkSpaceCarWidth = 0,parkSpaceCarHeight = 0,parkSpaceCarType = 0,parkSpaceCarWheelBase = 0,parkSpaceCarWheelWidth = 0,entryTime = NULL,leaveTime = NULL"); Error_manager ec = Database_controller::get_instance_pointer()->sql_update(update_space_sql); return ec; } // 更新数据库中车位状态 //根据车位ID更改车位状态 Error_manager Parkspace_operating_function::update_parkspace_data(message::Parkspace_info parkspace_info) { //执行sql操作 char update_space_sql[1024]; memset(update_space_sql, 0, 1024); int status = parkspace_info.parkingspace_status(); if ( status < 0 || status >5 ) { return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR, "参数错误 Parkspace_operating_function::update_parkspace_data error "); } // switch (parkspace_info.parkingspace_status()) // { // case message::Parkspace_status::eParkspace_empty: // status = 0; // break; // case message::Parkspace_status::eParkspace_occupied: // status = 1; // break; // case message::Parkspace_status::eParkspace_reserved: // status = 2; // break; // case message::Parkspace_status::eParkspace_locked: // status = 3; // break; // case message::Parkspace_status::eParkspace_error: // status = 4; // break; // default: // return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR, // "参数错误 Parkspace_operating_function::update_parkspace_data error "); // break; // } if(parkspace_info.has_car_info() && status!=message::Parkspace_status::eParkspace_empty) { sprintf(update_space_sql, "update parkingspace set parkingspace_status = %d,parkSpaceCarLicense = '%s',parkSpaceCarLength = %.3f,parkSpaceCarWidth = %.3f,parkSpaceCarHeight = %.3f,parkSpaceCarType = %d,parkSpaceCarWheelBase = %.3f,parkSpaceCarWheelWidth = %.3f,entryTime = '%s',leaveTime = '%s' where parkingSpaceID = %d", status, parkspace_info.car_info().license().c_str(), parkspace_info.car_info().has_car_length()?parkspace_info.car_info().car_length():0.0f, parkspace_info.car_info().car_width(), parkspace_info.car_info().car_height(), parkspace_info.car_type(), parkspace_info.car_info().car_wheel_base(), parkspace_info.car_info().car_wheel_width(), parkspace_info.entry_time().c_str(), parkspace_info.leave_time().c_str(), parkspace_info.parkingspace_index_id()); }else { sprintf(update_space_sql, "update parkingspace set parkingspace_status = %d,parkSpaceCarLicense = NULL,parkSpaceCarLength = 0,parkSpaceCarWidth = 0,parkSpaceCarHeight = 0,parkSpaceCarType = 0,parkSpaceCarWheelBase = 0,parkSpaceCarWheelWidth = 0,entryTime = NULL,leaveTime = NULL where parkingSpaceID = %d", status, parkspace_info.parkingspace_index_id()); } //boost::shared_ptr tp_result = nullptr; Error_manager ec = Database_controller::get_instance_pointer()->sql_update(update_space_sql); return ec; } // 更新数据库车辆信息,车位信息中包含车辆信息用于匹配更新 Error_manager Parkspace_operating_function::update_vehicle_with_parkspace(message::Parkspace_info parkspace_info, message::Vehicle_status &vehicle_status) { //执行sql操作 if(!parkspace_info.has_car_info()) { return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR, "参数错误 Parkspace_operating_function::update_vehicle_with_parkspace error ");; } std::string find_vehicle_sql = std::string("select * from vehicle where numberPlate = '").append(parkspace_info.car_info().license()).append("'"); boost::shared_ptr query_vehicle_result = nullptr; Database_controller::get_instance_pointer()->sql_query(find_vehicle_sql, query_vehicle_result); //判断车辆是否存在 if(query_vehicle_result == nullptr || !query_vehicle_result->next()) { return insert_vehicle_with_parkspace(parkspace_info, vehicle_status); } else { char update_vehicle_sql[1024]; memset(update_vehicle_sql, 0, 1024); int vehicle_status_code = -1; switch (vehicle_status) { case message::Vehicle_status::eVehicle_idle: vehicle_status_code = 1; break; case message::Vehicle_status::eVehicle_in_garage: vehicle_status_code = 2; break; case message::Vehicle_status::eVehicle_parking: vehicle_status_code = 3; break; case message::Vehicle_status::eVehicle_fetching: vehicle_status_code = 4; break; case message::Vehicle_status::eVehicle_reserved: vehicle_status_code = 5; break; default: return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR, "参数错误 Parkspace_operating_function::update_vehicle_with_parkspace error "); break; } if ( vehicle_status_code == 1 ) { sprintf(update_vehicle_sql, "update vehicle set vehicleParkState = 1,carLength=NULL,carWidth=NULL,carHeight=NULL,carWheelBase = NULL,carWheelWidth = NULL,parkingSpaceID=NULL,parkingRecordsID=NULL where numberPlate = '%s'", parkspace_info.car_info().license().c_str()); } //车位为空,仅更新车辆状态与长宽高 else if(parkspace_info.parkingspace_index_id() <= 0) { sprintf(update_vehicle_sql, "update vehicle set vehicleParkState = %d,carLength=%.3f,carWidth=%.3f,carHeight=%.3f,carWheelBase = %.3f,carWheelWidth = %.3f where numberPlate = '%s'", vehicle_status_code, parkspace_info.car_info().car_length(), parkspace_info.car_info().car_width(), parkspace_info.car_info().car_height(), parkspace_info.car_info().car_wheel_base(), parkspace_info.car_info().car_wheel_width(), parkspace_info.car_info().license().c_str()); } //车位不为空,表示车辆所在车位,同时更新 else { sprintf(update_vehicle_sql, "update vehicle set vehicleParkState = %d,carLength=%.3f,carWidth=%.3f,carHeight=%.3f,carWheelBase = %.3f,carWheelWidth = %.3f,parkingSpaceID=%d where numberPlate = '%s'", vehicle_status_code, parkspace_info.car_info().car_length(), parkspace_info.car_info().car_width(), parkspace_info.car_info().car_height(), parkspace_info.car_info().car_wheel_base(), parkspace_info.car_info().car_wheel_width(), parkspace_info.parkingspace_index_id(), parkspace_info.car_info().license().c_str()); } Error_manager ec = Database_controller::get_instance_pointer()->sql_update(update_vehicle_sql); return ec; } } //更新停车记录ID Error_manager Parkspace_operating_function::update_record_id(std::string license, int record_id) { message::Vehicle_status vehicle_status; int t_record_id; Error_manager ec = query_vehicle(license,vehicle_status,t_record_id); if ( vehicle_status != message::Vehicle_status::eVehicle_in_garage ) { return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR, " Parkspace_operating_function::insert_vehicle_with_parkspace error "); } char update_vehicle_sql[1024]; memset(update_vehicle_sql, 0, 1024); sprintf(update_vehicle_sql, "update vehicle set parkingRecordsID = %d where numberPlate = '%s'",record_id,license.c_str()); ec = Database_controller::get_instance_pointer()->sql_update(update_vehicle_sql); return ec; } // 插入车辆 Error_manager Parkspace_operating_function::insert_vehicle_with_parkspace(message::Parkspace_info parkspace_info, message::Vehicle_status &vehicle_status) { //执行sql操作 if(!parkspace_info.has_car_info()) { return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR, " Parkspace_operating_function::insert_vehicle_with_parkspace error "); } char insert_vehicle_sql[1024]; memset(insert_vehicle_sql, 0, 1024); int vehicle_status_code = -1; switch (vehicle_status) { case message::Vehicle_status::eVehicle_idle: vehicle_status_code = 1; break; case message::Vehicle_status::eVehicle_in_garage: vehicle_status_code = 2; break; case message::Vehicle_status::eVehicle_parking: vehicle_status_code = 3; break; case message::Vehicle_status::eVehicle_fetching: vehicle_status_code = 4; break; case message::Vehicle_status::eVehicle_reserved: vehicle_status_code = 5; break; default: return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR, "参数错误 Parkspace_operating_function::insert_vehicle_with_parkspace error "); break; } //车位为空,仅更新车辆状态与长宽高 if(parkspace_info.parkingspace_index_id() <= 0) { sprintf(insert_vehicle_sql, "INSERT INTO vehicle (numberPlate,vehicleParkState,carLength,carWidth,carHeight,carWheelBase,carWheelWidth) values ('%s',%d,%.3f,%.3f,%.3f,%.3f,%.3f)", parkspace_info.car_info().license().c_str(), vehicle_status_code, parkspace_info.car_info().car_length(), parkspace_info.car_info().car_width(), parkspace_info.car_info().car_height(), parkspace_info.car_info().car_wheel_base(), parkspace_info.car_info().car_wheel_width()); } //车位不为空,表示车辆在车位,同时更新 else { sprintf(insert_vehicle_sql, "INSERT INTO vehicle (numberPlate,vehicleParkState,carLength,carWidth,carHeight,carWheelBase,carWheelWidth,parkingSpaceID) values ('%s',%d,%.3f,%.3f,%.3f,%.3f,%.3f,%d)", parkspace_info.car_info().license().c_str(), vehicle_status_code, parkspace_info.car_info().car_length(), parkspace_info.car_info().car_width(), parkspace_info.car_info().car_height(), parkspace_info.car_info().car_wheel_base(), parkspace_info.car_info().car_wheel_width(), parkspace_info.parkingspace_index_id()); } Error_manager ec = Database_controller::get_instance_pointer()->sql_insert(insert_vehicle_sql); return ec; } // 插入停车记录 Error_manager Parkspace_operating_function::insert_parking_record(message::Parkspace_info parkspace_info) { //参数中必须包含车辆信息与车位编号 if(!parkspace_info.has_car_info() || parkspace_info.parkingspace_index_id() <= 0) { return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR, "参数错误 Parkspace_operating_function::insert_parking_record error "); } char insert_parking_record_sql[1024]; memset(insert_parking_record_sql, 0, 1024); //将车辆号牌,车位ID,记录状态,停车与取车时间写入 sprintf(insert_parking_record_sql, "INSERT INTO parkingrecords (numberPlate,parkingSpaceID,realParkTime) values ('%s',%d,'%s')", parkspace_info.car_info().license().c_str(), parkspace_info.parkingspace_index_id(), parkspace_info.entry_time().c_str()); Error_manager ec = Database_controller::get_instance_pointer()->sql_insert(insert_parking_record_sql); return ec; } // 更新停车记录,待计费系统加入后完善!!! Error_manager Parkspace_operating_function::update_parking_record(message::Parkspace_info parkspace_info, int record_id) { //执行sql操作 if(!parkspace_info.has_car_info() || parkspace_info.parkingspace_index_id() <= 0) { return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR, "参数错误 update_parking_record::insert_parking_record error ");; } char update_parking_record_sql[1024]; memset(update_parking_record_sql, 0, 1024); sprintf(update_parking_record_sql, "update parkingrecords set realGetTime='%s',parkingPrice=%d where parkingRecordsID = %d", parkspace_info.leave_time().c_str(), 0, record_id); Error_manager ec = Database_controller::get_instance_pointer()->sql_update(update_parking_record_sql); return ec; } // 根据车位编号查询车位信息 Error_manager Parkspace_operating_function::query_one_parkspace_with_parkspace_id(int parkspace_id, message::Parkspace_info &parkspace_info) { //执行sql操作 std::string query_parkspace_sql = std::string("select * from parkingspace where parkingSpaceID=").append(std::to_string(parkspace_id)); boost::shared_ptr tp_result = nullptr; Error_manager ec = Database_controller::get_instance_pointer()->sql_query(query_parkspace_sql, tp_result); if(ec == SUCCESS) { if(tp_result == nullptr) { return Error_manager(Error_code::DB_RESULT_SET_EMPTY, Error_level::MAJOR_ERROR, " 数据库外层查询返回结果空指针 Parkspace_operating_function::query_one_parkspace_with_parkspace_id error ");; } if (tp_result->next()) { char buf[1024]; memset(buf, 0, 1024); try { parkspace_info.set_parkingspace_status((message::Parkspace_status)tp_result->getInt("parkingspace_status")); // switch (tp_result->getInt("parkingspace_status")) // { // case 1: // parkspace_info.set_parkingspace_status(message::Parkspace_status::eParkspace_empty); // break; // case 2: // parkspace_info.set_parkingspace_status(message::Parkspace_status::eParkspace_occupied); // break; // case 3: // parkspace_info.set_parkingspace_status(message::Parkspace_status::eParkspace_reserved); // break; // case 4: // parkspace_info.set_parkingspace_status(message::Parkspace_status::eParkspace_locked); // break; // case 5: // parkspace_info.set_parkingspace_status(message::Parkspace_status::eParkspace_error); // break; // default: // parkspace_info.set_parkingspace_status(message::Parkspace_status::eParkspace_error); // break; // } parkspace_info.set_parkingspace_index_id(tp_result->getInt("parkingSpaceID")); parkspace_info.set_parkingspace_unit_id(tp_result->getInt("parkingspace_unit_id")); parkspace_info.set_parkingspace_room_id(tp_result->getInt("parkingspace_room_id")); parkspace_info.set_parkingspace_direction(tp_result->getInt("parkingspace_direction") > 0 ? message::Direction::eForward : message::Direction::eBackward); parkspace_info.set_parkingspace_floor_id(tp_result->getInt("parkingspace_floor_id")); parkspace_info.set_parkingspace_width(tp_result->getDouble("parkingspace_width")); parkspace_info.set_parkingspace_height(tp_result->getDouble("parkingspace_height")); parkspace_info.mutable_car_info()->set_license(tp_result->getString("parkSpaceCarLicense")); parkspace_info.mutable_car_info()->set_car_length(tp_result->getDouble("parkSpaceCarLength")); parkspace_info.mutable_car_info()->set_car_width(tp_result->getDouble("parkSpaceCarWidth")); parkspace_info.mutable_car_info()->set_car_height(tp_result->getDouble("parkSpaceCarHeight")); parkspace_info.set_car_type((message::Car_type)tp_result->getInt("parkSpaceCarType")); parkspace_info.mutable_car_info()->set_car_wheel_base(tp_result->getDouble("parkSpaceCarWheelBase")); parkspace_info.mutable_car_info()->set_car_wheel_width(tp_result->getDouble("parkSpaceCarWheelWidth")); parkspace_info.set_entry_time(tp_result->getString("entryTime")); parkspace_info.set_leave_time(tp_result->getString("leaveTime")); } catch (sql::SQLException &e) { /* Use what() (derived from std::runtime_error) to fetch the error message */ sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str()); return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf); } catch (std::runtime_error &e) { sprintf(buf, "# ERR: %s\n ERR: runtime_error in %s ", e.what(), __FILE__); return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf); } if (tp_result->next()) { return Error_manager(Error_code::DB_QUERY_DATA_REPEAT, Error_level::MAJOR_ERROR, "数据库查询数据重复 Parkspace_operating_function::query_one_parkspace_with_parkspace_id error "); } } else { return Error_manager(Error_code::DB_QUERY_NOT_DATA, Error_level::MINOR_ERROR, "数据库查询未找到数据 Parkspace_operating_function::query_one_parkspace_with_parkspace_id error "); } return SUCCESS; } else { return ec; } } // 根据车牌号查询车位 Error_manager Parkspace_operating_function::query_one_parkspace_with_license(std::string license, message::Parkspace_info &parkspace_info) { //执行sql操作 std::string query_parkspace_sql = std::string("select * from parkingspace where parkSpaceCarLicense='").append(license).append("'"); boost::shared_ptr tp_result = nullptr; Error_manager ec = Database_controller::get_instance_pointer()->sql_query(query_parkspace_sql, tp_result); if(ec == SUCCESS) { if(tp_result == nullptr) { return Error_manager(Error_code::DB_RESULT_SET_EMPTY, Error_level::MINOR_ERROR, "数据库外层查询返回结果空指针 Parkspace_operating_function::query_one_parkspace_with_license error "); } if (tp_result->next()) { char buf[1024]; memset(buf, 0, 1024); try { parkspace_info.set_parkingspace_status((message::Parkspace_status)tp_result->getInt("parkingspace_status")); // switch (tp_result->getInt("parkingspace_status")) // { // case 1: // parkspace_info.set_parkingspace_status(message::Parkspace_status::eParkspace_empty); // break; // case 2: // parkspace_info.set_parkingspace_status(message::Parkspace_status::eParkspace_occupied); // break; // case 3: // parkspace_info.set_parkingspace_status(message::Parkspace_status::eParkspace_reserved); // break; // case 4: // parkspace_info.set_parkingspace_status(message::Parkspace_status::eParkspace_locked); // break; // case 5: // parkspace_info.set_parkingspace_status(message::Parkspace_status::eParkspace_error); // break; // default: // parkspace_info.set_parkingspace_status(message::Parkspace_status::eParkspace_error); // break; // } parkspace_info.set_parkingspace_index_id(tp_result->getInt("parkingSpaceID")); parkspace_info.set_parkingspace_unit_id(tp_result->getInt("parkingspace_unit_id")); parkspace_info.set_parkingspace_room_id(tp_result->getInt("parkingspace_room_id")); parkspace_info.set_parkingspace_direction(tp_result->getInt("parkingspace_direction") > 0 ? message::Direction::eForward : message::Direction::eBackward); parkspace_info.set_parkingspace_floor_id(tp_result->getInt("parkingspace_floor_id")); parkspace_info.set_parkingspace_width(tp_result->getDouble("parkingspace_width")); parkspace_info.set_parkingspace_height(tp_result->getDouble("parkingspace_height")); parkspace_info.mutable_car_info()->set_license(tp_result->getString("parkSpaceCarLicense")); parkspace_info.mutable_car_info()->set_car_length(tp_result->getDouble("parkSpaceCarLength")); parkspace_info.mutable_car_info()->set_car_width(tp_result->getDouble("parkSpaceCarWidth")); parkspace_info.mutable_car_info()->set_car_height(tp_result->getDouble("parkSpaceCarHeight")); parkspace_info.set_car_type((message::Car_type)tp_result->getInt("parkSpaceCarType")); parkspace_info.mutable_car_info()->set_car_wheel_base(tp_result->getDouble("parkSpaceCarWheelBase")); parkspace_info.mutable_car_info()->set_car_wheel_width(tp_result->getDouble("parkSpaceCarWheelWidth")); parkspace_info.set_entry_time(tp_result->getString("entryTime")); parkspace_info.set_leave_time(tp_result->getString("leaveTime")); } catch (sql::SQLException &e) { /* Use what() (derived from std::runtime_error) to fetch the error message */ sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str()); return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf); } catch (std::runtime_error &e) { sprintf(buf, "# ERR: %s\n ERR: runtime_error in %s ", e.what(), __FILE__); return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf); } if (tp_result->next()) { return Error_manager(Error_code::DB_QUERY_DATA_REPEAT, Error_level::MAJOR_ERROR, "数据库查询数据重复 Parkspace_operating_function::query_one_parkspace_with_license error "); } } else { return Error_manager(Error_code::DB_QUERY_NOT_DATA, Error_level::MINOR_ERROR, "数据库未查询到数据 Parkspace_operating_function::query_one_parkspace_with_license error "); } return SUCCESS; } else { return ec; } } // 找到一个空车位 Error_manager Parkspace_operating_function::query_one_empty_parkspace(message::Parkspace_info &parkspace_info) { //执行sql操作 std::string query_parkspace_sql = std::string("select * from parkingspace where parkingspace_status=0"); boost::shared_ptr tp_result = nullptr; Error_manager ec = Database_controller::get_instance_pointer()->sql_query(query_parkspace_sql, tp_result); if(ec == SUCCESS) { if(tp_result == nullptr) { return DB_RESULT_SET_EMPTY; } if (tp_result->next()) { char buf[1024]; memset(buf, 0, 1024); try { if ( tp_result->getInt("parkingspace_status") != message::Parkspace_status::eParkspace_empty ) { return Error_manager(Error_code::DB_QUERY_DATA_FAILED, Error_level::MAJOR_ERROR, "数据库查询数据错误 Parkspace_operating_function::query_one_empty_parkspace error "); } parkspace_info.set_parkingspace_status(message::Parkspace_status::eParkspace_empty); parkspace_info.set_parkingspace_index_id(tp_result->getInt("parkingSpaceID")); parkspace_info.set_parkingspace_unit_id(tp_result->getInt("parkingspace_unit_id")); parkspace_info.set_parkingspace_room_id(tp_result->getInt("parkingspace_room_id")); parkspace_info.set_parkingspace_direction(tp_result->getInt("parkingspace_direction") > 0 ? message::Direction::eForward : message::Direction::eBackward); parkspace_info.set_parkingspace_floor_id(tp_result->getInt("parkingspace_floor_id")); parkspace_info.set_parkingspace_width(tp_result->getDouble("parkingspace_width")); parkspace_info.set_parkingspace_height(tp_result->getDouble("parkingspace_height")); parkspace_info.mutable_car_info()->set_license(tp_result->getString("parkSpaceCarLicense")); parkspace_info.mutable_car_info()->set_car_length(tp_result->getDouble("parkSpaceCarLength")); parkspace_info.mutable_car_info()->set_car_width(tp_result->getDouble("parkSpaceCarWidth")); parkspace_info.mutable_car_info()->set_car_height(tp_result->getDouble("parkSpaceCarHeight")); parkspace_info.set_car_type((message::Car_type)tp_result->getInt("parkSpaceCarType")); parkspace_info.mutable_car_info()->set_car_wheel_base(tp_result->getDouble("parkSpaceCarWheelBase")); parkspace_info.mutable_car_info()->set_car_wheel_width(tp_result->getDouble("parkSpaceCarWheelWidth")); parkspace_info.set_entry_time(tp_result->getString("entryTime")); parkspace_info.set_leave_time(tp_result->getString("leaveTime")); } catch (sql::SQLException &e) { /* Use what() (derived from std::runtime_error) to fetch the error message */ sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str()); return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf); } catch (std::runtime_error &e) { sprintf(buf, "# ERR: %s\n ERR: runtime_error in %s ", e.what(), __FILE__); return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf); } } else { return Error_manager(Error_code::DB_NOT_QUERY_EMPTY_PARKSPACE, Error_level::MINOR_ERROR, "数据库未查询到空车位 Parkspace_operating_function::query_one_empty_parkspace error "); } return SUCCESS; } else { return ec; } return SUCCESS; } // 查询车辆状态,暂时不使用 Error_manager Parkspace_operating_function::query_vehicle(std::string license, message::Vehicle_status &vehicle_status, int &park_record_id) { //执行sql操作 std::string query_parkspace_sql = std::string("select * from vehicle where numberPlate='").append(license).append("'"); boost::shared_ptr tp_result = nullptr; Error_manager ec = Database_controller::get_instance_pointer()->sql_query(query_parkspace_sql, tp_result); if(ec == SUCCESS) { if(tp_result == nullptr) { return Error_manager(Error_code::DB_RESULT_SET_EMPTY, Error_level::MINOR_ERROR, "Parkspace_operating_function::query_vehicle error "); } if (tp_result->next()) { char buf[1024]; memset(buf, 0, 1024); try { switch (tp_result->getInt("vehicleParkState")) { case 1: vehicle_status = message::Vehicle_status::eVehicle_idle; break; case 2: vehicle_status = message::Vehicle_status::eVehicle_in_garage; break; case 3: vehicle_status = message::Vehicle_status::eVehicle_parking; break; case 4: vehicle_status = message::Vehicle_status::eVehicle_fetching; break; case 5: vehicle_status = message::Vehicle_status::eVehicle_reserved; break; default: return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR, "参数错误 Parkspace_operating_function::query_vehicle error "); } park_record_id = tp_result->getInt("parkingRecordsID"); } catch (sql::SQLException &e) { /* Use what() (derived from std::runtime_error) to fetch the error message */ sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str()); return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf); } catch (std::runtime_error &e) { sprintf(buf, "# ERR: %s\n ERR: runtime_error in %s ", e.what(), __FILE__); return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf); } } return SUCCESS; } else { return ec; } } // 查询停车记录,根据车牌号、车位id查询,反馈停车记录id Error_manager Parkspace_operating_function::query_parking_record(message::Parkspace_info &parkspace_info, int &record_id) { //执行sql操作 if(!parkspace_info.has_car_info() || parkspace_info.parkingspace_index_id() <= 0) { return Error_manager(Error_code::PARAMETER_ERROR, Error_level::MINOR_ERROR, " Parkspace_operating_function::query_parking_record error "); } 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.parkingspace_index_id())).append(" ORDER BY parkingRecordsID DESC"); boost::shared_ptr tp_result = nullptr; Error_manager ec = Database_controller::get_instance_pointer()->sql_query(query_park_record_sql, tp_result); if(ec == SUCCESS) { if(tp_result == nullptr) { return Error_manager(Error_code::DB_RESULT_SET_EMPTY, Error_level::MINOR_ERROR, " Parkspace_operating_function::query_parking_record error "); } if (tp_result->next()) { char buf[1024]; memset(buf, 0, 1024); try { record_id = tp_result->getInt("parkingRecordsID"); } catch (sql::SQLException &e) { /* Use what() (derived from std::runtime_error) to fetch the error message */ sprintf(buf, "# ERR: %s\n (MySQL error code: %d, SQLState: %s", e.what(), e.getErrorCode(), e.getSQLState().c_str()); return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf); } catch (std::runtime_error &e) { sprintf(buf, "# ERR: %s\n ERR: runtime_error in %s ", e.what(), __FILE__); return Error_manager(DB_RESULT_SET_PARSE_ERROR, NEGLIGIBLE_ERROR, buf); } } return SUCCESS; } else { return ec; } }