data: Add StorageElementComponent to Storage injection
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user