data: saving and retrieving access components from and to Storage again
This commit is contained in:
@@ -119,6 +119,16 @@ Id SqliteStorage::addNameHierarchyElement(const std::string& name, Id parentId)
|
||||
return m_database.lastRowId();
|
||||
}
|
||||
|
||||
Id SqliteStorage::addComponentAccess(Id memberEdgeId, int type)
|
||||
{
|
||||
m_database.execDML((
|
||||
"INSERT INTO component_access(id, edge_id, type) "
|
||||
"VALUES (NULL, '" + std::to_string(memberEdgeId) + "', " + std::to_string(type) + ");"
|
||||
).c_str());
|
||||
|
||||
return m_database.lastRowId();
|
||||
}
|
||||
|
||||
void SqliteStorage::removeElement(Id id)
|
||||
{
|
||||
m_database.execDML((
|
||||
@@ -585,6 +595,24 @@ Id SqliteStorage::getElementIdByLocationId(Id locationId) const
|
||||
);
|
||||
}
|
||||
|
||||
StorageComponentAccess SqliteStorage::getComponentAccessByMemberEdgeId(Id memberEdgeId) const
|
||||
{
|
||||
CppSQLite3Query q = m_database.execQuery((
|
||||
"SELECT id, edge_id, type FROM component_access WHERE edge_id == " + std::to_string(memberEdgeId) + ";"
|
||||
).c_str());
|
||||
|
||||
while (!q.eof())
|
||||
{
|
||||
return StorageComponentAccess(
|
||||
q.getIntField(0, 0),
|
||||
q.getIntField(1, 0),
|
||||
q.getIntField(2, 0)
|
||||
);
|
||||
}
|
||||
|
||||
return StorageComponentAccess(0, 0, 0);
|
||||
}
|
||||
|
||||
int SqliteStorage::getNodeCount() const
|
||||
{
|
||||
return m_database.execScalar("SELECT COUNT(*) from node;");
|
||||
@@ -654,7 +682,7 @@ void SqliteStorage::setupTables()
|
||||
"id INTEGER NOT NULL, "
|
||||
"name TEXT, "
|
||||
"parent_id INTEGER, "
|
||||
"PRIMARY KEY(id)"
|
||||
"PRIMARY KEY(id), "
|
||||
"FOREIGN KEY(parent_id) REFERENCES name_hierarchy_element(id) ON DELETE CASCADE);" // maybe use restrict here
|
||||
);
|
||||
|
||||
@@ -668,10 +696,19 @@ void SqliteStorage::setupTables()
|
||||
"end_line INTEGER, "
|
||||
"end_column INTEGER, "
|
||||
"is_scope INTEGER, "
|
||||
"PRIMARY KEY(id)"
|
||||
"PRIMARY KEY(id), "
|
||||
"FOREIGN KEY(element_id) REFERENCES element(id) ON DELETE CASCADE, "
|
||||
"FOREIGN KEY(file_node_id) REFERENCES node(id) ON DELETE CASCADE);"
|
||||
);
|
||||
|
||||
m_database.execDML(
|
||||
"CREATE TABLE IF NOT EXISTS component_access("
|
||||
"id INTEGER NOT NULL, "
|
||||
"edge_id INTEGER, "
|
||||
"type INTEGER NOT NULL, "
|
||||
"PRIMARY KEY(id), "
|
||||
"FOREIGN KEY(edge_id) REFERENCES element(id) ON DELETE CASCADE);"
|
||||
);
|
||||
}
|
||||
|
||||
StorageFile SqliteStorage::getFirstFile(const std::string& query) const
|
||||
|
||||
@@ -33,6 +33,7 @@ public:
|
||||
int addSourceLocation(Id elementId, Id fileNodeId, uint startLine, uint startCol, uint endLine, uint endCol, bool isScope);
|
||||
Id addNameHierarchyElement(const std::string& name);
|
||||
Id addNameHierarchyElement(const std::string& name, Id parentId);
|
||||
Id addComponentAccess(Id memberEdgeId, int type);
|
||||
|
||||
void removeElement(Id id);
|
||||
void removeNameHierarchyElement(Id id);
|
||||
@@ -79,6 +80,8 @@ public:
|
||||
|
||||
Id getElementIdByLocationId(Id locationId) const;
|
||||
|
||||
StorageComponentAccess getComponentAccessByMemberEdgeId(Id memberEdgeId) const;
|
||||
|
||||
int getNodeCount() const;
|
||||
int getEdgeCount() const;
|
||||
int getNameHierarchyElementCount() const;
|
||||
|
||||
@@ -177,9 +177,9 @@ Id Storage::onTypedefParsed(
|
||||
){
|
||||
Id typedefNodeId = addNodeHierarchy(Node::NODE_TYPEDEF, nameHierarchy);
|
||||
addSourceLocation(typedefNodeId, location);
|
||||
addAccess(typedefNodeId, access);
|
||||
|
||||
Id underlyingTypeNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, underlyingType.dataType->getTypeNameHierarchy());
|
||||
|
||||
addEdge(typedefNodeId, underlyingTypeNodeId, Edge::EDGE_TYPEDEF_OF, location);
|
||||
|
||||
return typedefNodeId;
|
||||
@@ -194,6 +194,8 @@ Id Storage::onClassParsed(
|
||||
addSourceLocation(nodeId, location);
|
||||
addSourceLocation(nodeId, scopeLocation, true);
|
||||
|
||||
addAccess(nodeId, access);
|
||||
|
||||
return nodeId;
|
||||
}
|
||||
|
||||
@@ -206,6 +208,8 @@ Id Storage::onStructParsed(
|
||||
addSourceLocation(nodeId, location);
|
||||
addSourceLocation(nodeId, scopeLocation, true);
|
||||
|
||||
addAccess(nodeId, access);
|
||||
|
||||
return nodeId;
|
||||
}
|
||||
|
||||
@@ -215,10 +219,8 @@ Id Storage::onGlobalVariableParsed(const ParseLocation& location, const ParseVar
|
||||
addSourceLocation(nodeId, location);
|
||||
|
||||
Id typeNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, variable.type.dataType->getTypeNameHierarchy());
|
||||
|
||||
addEdge(nodeId, typeNodeId, Edge::EDGE_TYPE_OF, location);
|
||||
|
||||
|
||||
return nodeId;
|
||||
}
|
||||
|
||||
@@ -226,6 +228,7 @@ Id Storage::onFieldParsed(const ParseLocation& location, const ParseVariable& va
|
||||
{
|
||||
Id nodeId = addNodeHierarchy(Node::NODE_FIELD, variable.nameHierarchy);
|
||||
addSourceLocation(nodeId, location);
|
||||
addAccess(nodeId, access);
|
||||
|
||||
Id typeNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, variable.type.dataType->getTypeNameHierarchy());
|
||||
addEdge(nodeId, typeNodeId, Edge::EDGE_TYPE_OF, variable.type.location);
|
||||
@@ -258,6 +261,9 @@ Id Storage::onMethodParsed(
|
||||
const ParseLocation& scopeLocation
|
||||
){
|
||||
Id nodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_METHOD, method);
|
||||
addSourceLocation(nodeId, location);
|
||||
addSourceLocation(nodeId, scopeLocation, true);
|
||||
addAccess(nodeId, access);
|
||||
|
||||
Id returnTypeNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, method.returnType.dataType->getTypeNameHierarchy());
|
||||
addEdge(nodeId, returnTypeNodeId, Edge::EDGE_RETURN_TYPE_OF, method.returnType.location);
|
||||
@@ -268,9 +274,6 @@ Id Storage::onMethodParsed(
|
||||
addEdge(nodeId, parameternTypeNodeId, Edge::EDGE_PARAMETER_TYPE_OF, method.parameters[i].location);
|
||||
}
|
||||
|
||||
addSourceLocation(nodeId, location);
|
||||
addSourceLocation(nodeId, scopeLocation, true);
|
||||
|
||||
return nodeId;
|
||||
}
|
||||
|
||||
@@ -293,6 +296,7 @@ Id Storage::onEnumParsed(
|
||||
|
||||
addSourceLocation(nodeId, location);
|
||||
addSourceLocation(nodeId, scopeLocation, true);
|
||||
addAccess(nodeId, access);
|
||||
|
||||
return nodeId;
|
||||
}
|
||||
@@ -722,6 +726,22 @@ std::shared_ptr<Graph> Storage::getGraphForActiveTokenIds(const std::vector<Id>&
|
||||
}
|
||||
}
|
||||
|
||||
graph->forEachEdge(
|
||||
[this](Edge* edge)
|
||||
{
|
||||
if (!edge->isType(Edge::EDGE_MEMBER))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
StorageComponentAccess access = m_sqliteStorage.getComponentAccessByMemberEdgeId(edge->getId());
|
||||
if (access.id && access.type)
|
||||
{
|
||||
edge->addComponentAccess(std::make_shared<TokenComponentAccess>(TokenComponentAccess::intToType(access.type)));
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
@@ -1357,3 +1377,35 @@ Node* Storage::addNodeToGraph(const Id nodeId, Graph* graph) const
|
||||
std::make_shared<TokenComponentNameCached>(m_sqliteStorage.getNameHierarchyById(storageNode.nameId))
|
||||
);
|
||||
}
|
||||
|
||||
TokenComponentAccess::AccessType Storage::convertAccessType(ParserClient::AccessType access) const
|
||||
{
|
||||
switch (access)
|
||||
{
|
||||
case ACCESS_PUBLIC:
|
||||
return TokenComponentAccess::ACCESS_PUBLIC;
|
||||
case ACCESS_PROTECTED:
|
||||
return TokenComponentAccess::ACCESS_PROTECTED;
|
||||
case ACCESS_PRIVATE:
|
||||
return TokenComponentAccess::ACCESS_PRIVATE;
|
||||
case ACCESS_NONE:
|
||||
return TokenComponentAccess::ACCESS_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
void Storage::addAccess(const Id nodeId, ParserClient::AccessType access)
|
||||
{
|
||||
if (access == ACCESS_NONE)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<StorageEdge> memberEdges = m_sqliteStorage.getEdgesByTargetType(nodeId, Edge::EDGE_MEMBER);
|
||||
if (memberEdges.size() != 1)
|
||||
{
|
||||
LOG_ERROR_STREAM(<< "Cannot assign access" << access << " to node id " << nodeId << " because it's no child.");
|
||||
return;
|
||||
}
|
||||
|
||||
m_sqliteStorage.addComponentAccess(memberEdges[0].id, convertAccessType(access));
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
#include "data/access/StorageAccess.h"
|
||||
//#include "data/graph/token_component/TokenComponentAbstraction.h"
|
||||
//#include "data/graph/token_component/TokenComponentAccess.h"
|
||||
#include "data/graph/token_component/TokenComponentAccess.h"
|
||||
#include "data/location/TokenLocationCollection.h"
|
||||
#include "data/parser/ParserClient.h"
|
||||
#include "data/search/SearchIndex.h"
|
||||
@@ -161,6 +161,9 @@ private:
|
||||
void addAggregationEdgesToGraph(const Id nodeId, Graph* graph) const;
|
||||
Node* addNodeToGraph(const Id nodeId, Graph* graph) const;
|
||||
|
||||
TokenComponentAccess::AccessType convertAccessType(ParserClient::AccessType access) const;
|
||||
void addAccess(const Id nodeId, ParserClient::AccessType access);
|
||||
|
||||
SearchIndex m_tokenIndex;
|
||||
SqliteStorage m_sqliteStorage;
|
||||
|
||||
|
||||
@@ -68,4 +68,17 @@ struct StorageSourceLocation
|
||||
bool isScope;
|
||||
};
|
||||
|
||||
struct StorageComponentAccess
|
||||
{
|
||||
StorageComponentAccess(Id id, Id memberEdgeId, int type)
|
||||
: id(id)
|
||||
, memberEdgeId(memberEdgeId)
|
||||
, type(type)
|
||||
{}
|
||||
|
||||
Id id;
|
||||
Id memberEdgeId;
|
||||
int type;
|
||||
};
|
||||
|
||||
#endif // STORAGE_TYPES_H
|
||||
|
||||
@@ -16,6 +16,27 @@ std::string TokenComponentAccess::getAccessString(AccessType access)
|
||||
return "";
|
||||
}
|
||||
|
||||
int TokenComponentAccess::typeToInt(AccessType type)
|
||||
{
|
||||
return type;
|
||||
}
|
||||
|
||||
TokenComponentAccess::AccessType TokenComponentAccess::intToType(int value)
|
||||
{
|
||||
switch (value)
|
||||
{
|
||||
case 0x1:
|
||||
return ACCESS_PUBLIC;
|
||||
case 0x2:
|
||||
return ACCESS_PROTECTED;
|
||||
case 0x4:
|
||||
return ACCESS_PRIVATE;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return ACCESS_NONE;
|
||||
}
|
||||
|
||||
TokenComponentAccess::TokenComponentAccess(AccessType access)
|
||||
: m_access(access)
|
||||
{
|
||||
|
||||
@@ -9,16 +9,19 @@ class TokenComponentAccess
|
||||
: public TokenComponent
|
||||
{
|
||||
public:
|
||||
enum AccessType
|
||||
enum AccessType : int
|
||||
{
|
||||
ACCESS_PUBLIC,
|
||||
ACCESS_PROTECTED,
|
||||
ACCESS_PRIVATE,
|
||||
ACCESS_NONE
|
||||
ACCESS_PUBLIC = 0x1,
|
||||
ACCESS_PROTECTED = 0x2,
|
||||
ACCESS_PRIVATE = 0x4,
|
||||
ACCESS_NONE = 0x0
|
||||
};
|
||||
|
||||
static std::string getAccessString(AccessType access);
|
||||
|
||||
static int typeToInt(AccessType type);
|
||||
static AccessType intToType(int value);
|
||||
|
||||
TokenComponentAccess(AccessType access);
|
||||
virtual ~TokenComponentAccess();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user