add first draft of sqlliteConnector

pull/23/head
JuanJakobo 2022-07-12 18:15:21 +02:00
parent 2a09d8bee3
commit 2383a1bf23
2 changed files with 186 additions and 0 deletions

View File

@ -0,0 +1,148 @@
//------------------------------------------------------------------
// sqliteconnector.cpp
//
// Author: JuanJakobo
// Date: 18.07.2021
// Description:
//
//-------------------------------------------------------------------
#include "sqliteConnector.h"
#include "sqlite3.h"
#include "log.h"
#include <string>
#include <vector>
using std::string;
SqliteConnector::SqliteConnector(const string &DBpath) : _path(DBpath)
{
//TODO create sql Database at root and this one is the check
sqlite3 *db;
int result;
//change this
//iv_unlink(DB_FILE);
result = sqlite3_open(_path.c_str(), &db);
if (result)
{
//could not open
}
//modtime INTEGER,
result = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS metadata (etag VARCHAR, path VARCHAR, parentPath VARCHAR, PRIMARY KEY (path))", NULL, 0, NULL);
//TODO move
sqlite3_close(db);
}
SqliteConnector::~SqliteConnector()
{
//TODO DB does
//sqlite3_close(_db);
Log::writeInfoLog("closed DB");
}
std::vector<WebDAVItem> SqliteConnector::getItemsChildren(const string &parentPath)
{
//TODO call open?
//open();
//
sqlite3 *db;
int result = sqlite3_open(_path.c_str(), &db);
int rs;
sqlite3_stmt *stmt = 0;
std::vector<WebDAVItem> items;
rs = sqlite3_prepare_v2(db, "SELECT etag, path FROM 'metadata' WHERE parentPath = ?;", -1, &stmt, 0);
rs = sqlite3_bind_text(stmt, 1, parentPath.c_str(), parentPath.length(), NULL);
while (sqlite3_step(stmt) == SQLITE_ROW)
{
WebDAVItem temp;
temp.etag = reinterpret_cast<const char *>(sqlite3_column_text(stmt, 0));
temp.path = reinterpret_cast<const char *>(sqlite3_column_text(stmt, 1));
//temp.downloaded = static_cast<IsDownloaded>(sqlite3_column_int(stmt,8));
//TODO check if is downloaded and set this status
//std::string title;
//std::string localPath;
//FileState state{FileState::ICLOUD};
//Filetype
//add type or do automatically? Itemtype type;
//TODO add to DB
//std::string lastEditDate{"Error"};
//double size;
items.push_back(temp);
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return items;
}
//the first one is the parent and therefor should not be saved
bool SqliteConnector::saveItemsChildren(const std::vector<WebDAVItem> &children)
{
sqlite3 *db;
int result;
//TODO change this
//iv_unlink(DB_FILE);
result = sqlite3_open(_path.c_str(), &db);
//if (result)
//could not open
string parent = "test";
string stmt;
for (size_t i = 0; i < children.size(); i++)
{
//first item is parent
//is cut off before, there change to somewhere else
//not correct for main folder as there is no parent...
//TODO is always the parent, i just cut it of for the first entry:tabf
if(i == 0)
parent = children.at(i).path;
else
{
//TODO unquote etag
Log::writeInfoLog(children.at(i).etag + "path " + children.at(i).path);
stmt = stmt + " INSERT INTO metadata (etag, path, parentPath) VALUES ('" + children.at(i).etag + "','" + children.at(i).path + "','" + parent + "');";
}
}
result = sqlite3_exec(db, stmt.c_str(), NULL, 0, NULL);
if (result == SQLITE_CONSTRAINT)
{
//TODO what if item is already there? update? --> use replace?
}
else if (result != SQLITE_DONE)
{
Log::writeErrorLog(sqlite3_errmsg(db) + std::string(" (Error Code: ") + std::to_string(result) + ")");
}
/*
std::string _etag;
std::string _path;
std::string _title;
std::string _localPath;
FileState _state{FileState::ICLOUD};
Itemtype _type;
std::string _lastEditDate{"Error"};
double _size;
std::string _fileType;
*/
sqlite3_close(db);
return true;
//never need to get structure under the folder, as it is better to get it anyway?
}

View File

@ -0,0 +1,38 @@
//------------------------------------------------------------------
// sqliteconnector.h
//
// Author: JuanJakobo
// Date: 18.07.2021
// Description:
//
//-------------------------------------------------------------------
#ifndef SQLITECONNECTOR
#define SQLITECONNECTOR
#include "webDAVModel.h"
#include <string>
#include <vector>
class SqliteConnector
{
public:
/**
*
*/
SqliteConnector(const std::string &DBpath);
~SqliteConnector();
//TODO DOKU, open neede?
bool open();
std::vector<WebDAVItem> getItemsChildren(const std::string &parenthPath);
bool saveItemsChildren(const std::vector<WebDAVItem> &children);
private:
std::string _path;
};
#endif