Mercurial Hosting > traffic-intelligence
diff trajectorymanagement/src/TrajectoryDBAccessBlob.h @ 1159:e1e7acef8eab
moved trajectory management library into Traffic Intelligence
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Mon, 22 Feb 2021 22:09:35 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trajectorymanagement/src/TrajectoryDBAccessBlob.h Mon Feb 22 22:09:35 2021 -0500 @@ -0,0 +1,117 @@ +#ifndef TRAJECTORYDBACCESSBLOB_H_ +#define TRAJECTORYDBACCESSBLOB_H_ + +#include "TrajectoryDBAccess.h" + +/** + * TrajectoryDBAccessBlob class. + * + * The TrajectoryDBAccessBlob class allows to perform basic operations on a database representing trajectory as a Blob. + */ +template<typename T> +class TrajectoryDBAccessBlob: public TrajectoryDBAccess<T> +{ +public: + /** + * Create a table. + * + * @return information whether the operation was successful + */ + bool createTable(const std::string& tableName = "trajectories") + { + if (!TrajectoryDBAccess<T>::db->isConnected()) + { + return false; + } + + std::string statementString = "create table "+tableName+" ( trajectory_id INTEGER, trajectory BLOB );"; + const char *statement = statementString.c_str(); + + bool success = TrajectoryDBAccess<T>::db->executeStatement(statement); + return success; + } + + /** + * Read trajectories from a database. + * + * @param[out] trajectories trajectories + * @param[in] limit maximum number of trajectories, which will be read + * @param[in] offset offset + * @return information whether the operation was successful + */ + bool read(std::vector<Trajectory<T>*>* &trajectories, int limit = -1, int offset = -1, const std::string& tableName = "trajectories") + { + if (!TrajectoryDBAccess<T>::db->isConnected()) + { + return false; + } + + std::string statementString = "select * from "+tableName; + if (limit > 0) + { + statementString += " limit " + TrajectoryDBAccess<T>::toString(limit); + } + if (offset > 0) + { + statementString += " offset " + TrajectoryDBAccess<T>::toString(offset); + } + const char *statement = statementString.c_str(); + + std::vector<std::vector<std::string> > result; + bool success = TrajectoryDBAccess<T>::db->executeStatementGetMatrix(statement, result); + if (success) + { + if (trajectories == 0) + { + trajectories = new std::vector<Trajectory<T>*> (); + } + + for (unsigned int i = 0; i < result.size(); ++i) + { + std::string s = ""; + for (unsigned int j = 0; j < result[i].size(); ++j) + { + s += result[i][j]; + + if (j == 0) + { + s += " "; + } + } + + std::istringstream is(s); + Trajectory<T> *trajectory = new Trajectory<T> (); + is >> *trajectory; + trajectories->push_back(trajectory); + } + } + + return success; + } + + /** + * Write the trajectory to the database. + * + * @param[in] trajectory trajectory + * @return information whether the operation was successful + */ + bool write(const Trajectory<T> &trajectory, const std::string& tableName = "trajectories") + { + std::stringstream ss; + ss << trajectory; + std::string s = ss.str(); + + unsigned int sIdLen = TrajectoryDBAccess<T>::toString(trajectory.getId()).length(); + s[sIdLen] = ','; + s.insert(sIdLen, "\""); + s.insert(sIdLen + 2, "\""); + + std::string statementString = "insert into "+tableName+" (trajectory_id, trajectory) values (\"" + s + "\")"; + const char *statement = statementString.c_str(); + + bool success = TrajectoryDBAccess<T>::db->executeStatement(statement); + return success; + } +}; + +#endif /* TRAJECTORYDBACCESSBLOB_H_ */