data: Add StorageElementComponent to Storage injection

This commit is contained in:
Eberhard Graether
2019-05-21 17:56:50 +02:00
parent e2157b8352
commit 8c6ded28a8
10 changed files with 106 additions and 43 deletions
@@ -364,7 +364,7 @@ void TaskExecuteCustomCommands::runPythonPostProcessing(PersistentStorage& stora
{
for (size_t i = 0; i < ambiguousEdgeIds.size(); i++)
{
storage.addElementComponent(StorageElementComponentData(ambiguousEdgeIds[i], elementComponentKindToInt(ElementComponentKind::IS_AMBIGUOUS), L""));
storage.addElementComponent(StorageElementComponent(ambiguousEdgeIds[i], elementComponentKindToInt(ElementComponentKind::IS_AMBIGUOUS), L""));
storage.addOccurrence(StorageOccurrence(ambiguousEdgeIds[i], dataToInsert[i].sourceLocationId));
}
+21 -1
View File
@@ -197,7 +197,7 @@ void IntermediateStorage::addFile(const StorageFile& file)
m_filesIdIndex.emplace(file.id, m_files.size());
m_files.emplace_back(file);
}
}
void IntermediateStorage::setFileLanguage(Id fileId, const std::wstring& languageIdentifier)
@@ -302,6 +302,16 @@ void IntermediateStorage::addComponentAccesses(const std::vector<StorageComponen
m_componentAccesses.insert(componentAccesses.begin(), componentAccesses.end());
}
void IntermediateStorage::addElementComponent(const StorageElementComponent& component)
{
m_elementComponents.emplace(component);
}
void IntermediateStorage::addElementComponents(const std::vector<StorageElementComponent>& components)
{
m_elementComponents.insert(components.begin(), components.end());
}
Id IntermediateStorage::addError(const StorageErrorData& errorData)
{
auto it = m_errorsIndex.find(errorData);
@@ -356,6 +366,11 @@ const std::set<StorageComponentAccess>& IntermediateStorage::getComponentAccesse
return m_componentAccesses;
}
const std::set<StorageElementComponent>& IntermediateStorage::getElementComponents() const
{
return m_elementComponents;
}
const std::vector<StorageError>& IntermediateStorage::getErrors() const
{
return m_errors;
@@ -423,6 +438,11 @@ void IntermediateStorage::setComponentAccesses(std::set<StorageComponentAccess>
m_componentAccesses = std::move(componentAccesses);
}
void IntermediateStorage::setElementComponents(std::set<StorageElementComponent> components)
{
m_elementComponents = std::move(components);
}
void IntermediateStorage::setErrors(std::vector<StorageError> errors)
{
m_errors = std::move(errors);
+6 -1
View File
@@ -39,6 +39,8 @@ public:
void addOccurrences(const std::vector<StorageOccurrence>& occurrences) override;
void addComponentAccess(const StorageComponentAccess& componentAccess) override;
void addComponentAccesses(const std::vector<StorageComponentAccess>& componentAccesses) override;
void addElementComponent(const StorageElementComponent& component) override;
void addElementComponents(const std::vector<StorageElementComponent>& components) override;
Id addError(const StorageErrorData& errorData) override;
const std::vector<StorageNode>& getStorageNodes() const override;
@@ -49,6 +51,7 @@ public:
const std::set<StorageSourceLocation>& getStorageSourceLocations() const override;
const std::set<StorageOccurrence>& getStorageOccurrences() const override;
const std::set<StorageComponentAccess>& getComponentAccesses() const override;
const std::set<StorageElementComponent>& getElementComponents() const override;
const std::vector<StorageError>& getErrors() const override;
void setStorageNodes(std::vector<StorageNode> storageNodes);
@@ -59,6 +62,7 @@ public:
void setStorageSourceLocations(std::set<StorageSourceLocation> storageSourceLocations);
void setStorageOccurrences(std::set<StorageOccurrence> storageOccurrences);
void setComponentAccesses(std::set<StorageComponentAccess> componentAccesses);
void setElementComponents(std::set<StorageElementComponent> components);
void setErrors(std::vector<StorageError> errors);
Id getNextId() const;
@@ -72,7 +76,7 @@ private:
std::map<StorageFile, size_t> m_filesIndex; // this is used to prevent duplicates (unique)
std::map<Id, size_t> m_filesIdIndex;
std::vector<StorageFile> m_files;
std::vector<StorageSymbol> m_symbols;
std::map<StorageEdgeData, size_t> m_edgesIndex;
@@ -85,6 +89,7 @@ private:
std::set<StorageOccurrence> m_occurrences;
std::set<StorageComponentAccess> m_componentAccesses;
std::set<StorageElementComponent> m_elementComponents;
std::map<StorageErrorData, size_t> m_errorsIndex; // this is used to prevent duplicates (unique)
std::vector<StorageError> m_errors;
+12 -2
View File
@@ -140,9 +140,14 @@ void PersistentStorage::addComponentAccesses(const std::vector<StorageComponentA
m_sqliteIndexStorage.addComponentAccesses(componentAccesses);
}
void PersistentStorage::addElementComponent(const StorageElementComponentData& data)
void PersistentStorage::addElementComponent(const StorageElementComponent& component)
{
m_sqliteIndexStorage.addElementComponent(data);
m_sqliteIndexStorage.addElementComponent(component);
}
void PersistentStorage::addElementComponents(const std::vector<StorageElementComponent>& components)
{
m_sqliteIndexStorage.addElementComponents(components);
}
Id PersistentStorage::addError(const StorageErrorData& data)
@@ -200,6 +205,11 @@ const std::set<StorageComponentAccess>& PersistentStorage::getComponentAccesses(
return m_storageData.accesses = utility::toSet(m_sqliteIndexStorage.getAll<StorageComponentAccess>());
}
const std::set<StorageElementComponent>& PersistentStorage::getElementComponents() const
{
return m_storageData.components = utility::toSet(m_sqliteIndexStorage.getAll<StorageElementComponent>());
}
const std::vector<StorageError>& PersistentStorage::getErrors() const
{
std::vector<StorageError> errors;
+4 -1
View File
@@ -34,7 +34,8 @@ public:
void addOccurrences(const std::vector<StorageOccurrence>& occurrences) override;
void addComponentAccess(const StorageComponentAccess& componentAccess) override;
void addComponentAccesses(const std::vector<StorageComponentAccess>& componentAccesses) override;
void addElementComponent(const StorageElementComponentData& data) /*override*/;
void addElementComponent(const StorageElementComponent& component) override;
void addElementComponents(const std::vector<StorageElementComponent>& components) override;
Id addError(const StorageErrorData& data) override;
void removeElement(const Id id);
@@ -48,6 +49,7 @@ public:
const std::set<StorageSourceLocation>& getStorageSourceLocations() const override;
const std::set<StorageOccurrence>& getStorageOccurrences() const override;
const std::set<StorageComponentAccess>& getComponentAccesses() const override;
const std::set<StorageElementComponent>& getElementComponents() const override;
const std::vector<StorageError>& getErrors() const override;
void startInjection() override;
@@ -172,6 +174,7 @@ private:
std::set<StorageSourceLocation> locations;
std::set<StorageOccurrence> occurrences;
std::set<StorageComponentAccess> accesses;
std::set<StorageElementComponent> components;
std::vector<StorageError> errors;
} m_storageData;
+19
View File
@@ -236,6 +236,25 @@ void Storage::inject(Storage* injected)
addOccurrences(occurrences);
}
{
// TRACE("inject element components");
const std::set<StorageElementComponent>& oldComponents = injected->getElementComponents();
std::vector<StorageElementComponent> components;
components.reserve(oldComponents.size());
for (const StorageElementComponent& component : oldComponents)
{
auto it = injectedIdToOwnElementId.find(component.elementId);
if (it != injectedIdToOwnElementId.end())
{
components.emplace_back(it->second, component.type, component.data);
}
}
addElementComponents(components);
}
{
// TRACE("inject accesses");
+4
View File
@@ -9,6 +9,7 @@
#include "StorageComponentAccess.h"
#include "StorageEdge.h"
#include "StorageError.h"
#include "StorageElementComponent.h"
#include "StorageFile.h"
#include "StorageLocalSymbol.h"
#include "StorageNode.h"
@@ -38,6 +39,8 @@ public:
virtual void addOccurrences(const std::vector<StorageOccurrence>& occurrences) = 0;
virtual void addComponentAccess(const StorageComponentAccess& componentAccess) = 0;
virtual void addComponentAccesses(const std::vector<StorageComponentAccess>& componentAccesses) = 0;
virtual void addElementComponent(const StorageElementComponent& component) = 0;
virtual void addElementComponents(const std::vector<StorageElementComponent>& components) = 0;
virtual Id addError(const StorageErrorData& data) = 0;
virtual const std::vector<StorageNode>& getStorageNodes() const = 0;
@@ -48,6 +51,7 @@ public:
virtual const std::set<StorageSourceLocation>& getStorageSourceLocations() const = 0;
virtual const std::set<StorageOccurrence>& getStorageOccurrences() const = 0;
virtual const std::set<StorageComponentAccess>& getComponentAccesses() const = 0;
virtual const std::set<StorageElementComponent>& getElementComponents() const = 0;
virtual const std::vector<StorageError>& getErrors() const = 0;
void inject(Storage* injected);
@@ -408,15 +408,21 @@ bool SqliteIndexStorage::addComponentAccesses(const std::vector<StorageComponent
return m_insertComponentAccessBatchStatement.execute(componentAccesses, this);
}
int SqliteIndexStorage::addElementComponent(const StorageElementComponentData& storageElementComponentData)
void SqliteIndexStorage::addElementComponent(const StorageElementComponent& component)
{
m_insertElementComponentStmt.bind(1, int(storageElementComponentData.elementId));
m_insertElementComponentStmt.bind(2, storageElementComponentData.type);
m_insertElementComponentStmt.bind(3, utility::encodeToUtf8(storageElementComponentData.data).c_str());
m_insertElementComponentStmt.bind(1, int(component.elementId));
m_insertElementComponentStmt.bind(2, component.type);
m_insertElementComponentStmt.bind(3, utility::encodeToUtf8(component.data).c_str());
executeStatement(m_insertElementComponentStmt);
int id = m_database.lastRowId();
m_insertElementComponentStmt.reset();
return id;
}
void SqliteIndexStorage::addElementComponents(const std::vector<StorageElementComponent>& components)
{
for (const StorageElementComponent& component : components)
{
addElementComponent(component);
}
}
StorageError SqliteIndexStorage::addError(const StorageErrorData& data)
@@ -1545,20 +1551,19 @@ template <>
void SqliteIndexStorage::forEach<StorageElementComponent>(const std::string& query, std::function<void(StorageElementComponent&&)> func) const
{
CppSQLite3Query q = executeQuery(
"SELECT id, element_id, type, data FROM element_component " + query + ";"
"SELECT element_id, type, data FROM element_component " + query + ";"
);
while (!q.eof())
{
const Id id = q.getIntField(0, 0);
const Id elementId = q.getIntField(1, 0);
const int type = q.getIntField(2, -1);
const std::string data = q.getStringField(3, "");
const Id elementId = q.getIntField(0, 0);
const int type = q.getIntField(1, -1);
const std::string data = q.getStringField(2, "");
if (id != 0 && elementId != 0 && type != -1)
if (elementId != 0 && type != -1)
{
func(StorageElementComponent(
id, elementId, type, utility::decodeFromUtf8(data)
elementId, type, utility::decodeFromUtf8(data)
));
}
@@ -66,7 +66,8 @@ public:
bool addOccurrences(const std::vector<StorageOccurrence>& occurrences);
bool addComponentAccess(const StorageComponentAccess& componentAccess);
bool addComponentAccesses(const std::vector<StorageComponentAccess>& componentAccesses);
int addElementComponent(const StorageElementComponentData& storageElementComponentData);
void addElementComponent(const StorageElementComponent& component);
void addElementComponents(const std::vector<StorageElementComponent>& components);
StorageError addError(const StorageErrorData& data);
void removeElement(Id id);
@@ -5,43 +5,39 @@
#include "types.h"
struct StorageElementComponentData
struct StorageElementComponent
{
StorageElementComponentData()
StorageElementComponent()
: elementId(0)
, type(0)
, data(L"")
{}
StorageElementComponentData(Id elementId, int type, std::wstring data)
StorageElementComponent(Id elementId, int type, std::wstring data)
: elementId(elementId)
, type(type)
, data(std::move(data))
{}
bool operator<(const StorageElementComponent& other) const
{
if (elementId != other.elementId)
{
return elementId < other.elementId;
}
else if (type != other.type)
{
return type < other.type;
}
else
{
return data < other.data;
}
}
Id elementId;
int type;
std::wstring data;
};
struct StorageElementComponent : public StorageElementComponentData
{
StorageElementComponent()
: StorageElementComponentData()
, id(0)
{}
StorageElementComponent(Id id, const StorageElementComponentData& data)
: StorageElementComponentData(data)
, id(id)
{}
StorageElementComponent(Id id, Id elementId, int type, std::wstring data)
: StorageElementComponentData(elementId, type, data)
, id(id)
{}
Id id;
};
#endif // STORAGE_ELEMENT_COMPONENT_H