blob: a0fbb1ced4c24d573f00218690d7a9aef43f84f7 [file] [log] [blame]
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014, Regents of the University of California.
*
* This file is part of NDN repo-ng (Next generation of NDN repository).
* See AUTHORS.md for complete list of repo-ng authors and contributors.
*
* repo-ng is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* repo-ng is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* repo-ng, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef REPO_STORAGE_SQLITE_HANDLE_HPP
#define REPO_STORAGE_SQLITE_HANDLE_HPP
#include "storage-handle.hpp"
#include <string>
#include <iostream>
#include <sqlite3.h>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <algorithm>
namespace repo {
using std::queue;
class SqliteHandle : public StorageHandle
{
public:
class Error : public StorageHandle::Error
{
public:
explicit
Error(const std::string& what)
: StorageHandle::Error(what)
{
}
};
SqliteHandle();
explicit
SqliteHandle(const string& dbPath);
virtual
~SqliteHandle();
// from StorageHandle
virtual bool
insertData(const Data& data);
virtual bool
deleteData(const Name& name);
virtual bool
readData(const Interest& interest, Data& data);
virtual bool
hasName(const Name& name);
virtual bool
readNameAny(const Name& name, const Selectors& selectors, vector<Name>& names);
virtual size_t
size();
private:
void
initializeRepo();
/**
* @brief find data with the exact name matched
* @param[out] data Data matching Interest.
* @return if no data or something is wrong, return false
*/
bool
readData(const Name& name, Data& data);
/**
* @brief check whether there is one row with this parentName = parentName in database
* @return if no data or something is wrong, return false.
*/
bool
hasParentName(const Name& parentName) const;
/**
* @brief This function is for no selector, it will reply the leftmost data
* @param[out] data Data matching Interest.
* @return if no data or something is wrong, return false.
*/
bool
readDataPlain(const Name& name, Data& data);
/**
* @brief read data with this prefix or name
* @param name indicates name or prefix of interest
* @param[out] names is vector to contain the result of this function.
* @return success return true, error return false
*/
bool
readDataName(const Name& name, vector<Name>& names) const;
/**
* @brief read data with this prefix or name and selectors including MinSuffixComponents,
* MaxSuffixComponents, PublisherPublicKeyLocator, and Exclude.
* This method does not consider ChildSelector and MustBeFresh.
*
* @param name indicates name or prefix of interest
* @param[out] names is vector to contain the result of this function.
* @return success return true, error return false
*/
bool
readNameSelector(const Interest& interest, vector<Name>& names) const;
/**
* @brief ChildSelector filter
* @param names list of candidate names for ChildSelector filter
* @param[out] resultName is the result of selected name
* @return success return true, error return false
*/
bool
filterNameChild(const Name& name, int childSelector,
const vector<Name>& names, Name& resultName);
private:
sqlite3* m_db;
string m_dbPath;
};
} // namespace repo
#endif // REPO_STORAGE_SQLITE_HANDLE_HPP