Make MakePy<name>
less error prone
Reviewers: ipaljak Reviewed By: ipaljak Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D2696
This commit is contained in:
parent
eed83a210e
commit
f5a94d6e29
@ -34,7 +34,7 @@ struct PyVerticesIterator {
|
|||||||
PyGraph *py_graph;
|
PyGraph *py_graph;
|
||||||
};
|
};
|
||||||
|
|
||||||
PyObject *MakePyVertex(mgp_vertex *vertex, PyGraph *py_graph);
|
PyObject *MakePyVertex(const mgp_vertex &vertex, PyGraph *py_graph);
|
||||||
|
|
||||||
void PyVerticesIteratorDealloc(PyVerticesIterator *self) {
|
void PyVerticesIteratorDealloc(PyVerticesIterator *self) {
|
||||||
CHECK(self->it);
|
CHECK(self->it);
|
||||||
@ -54,8 +54,7 @@ PyObject *PyVerticesIteratorGet(PyVerticesIterator *self,
|
|||||||
CHECK(self->py_graph->graph);
|
CHECK(self->py_graph->graph);
|
||||||
const auto *vertex = mgp_vertices_iterator_get(self->it);
|
const auto *vertex = mgp_vertices_iterator_get(self->it);
|
||||||
if (!vertex) Py_RETURN_NONE;
|
if (!vertex) Py_RETURN_NONE;
|
||||||
return MakePyVertex(mgp_vertex_copy(vertex, self->py_graph->memory),
|
return MakePyVertex(*vertex, self->py_graph);
|
||||||
self->py_graph);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject *PyVerticesIteratorNext(PyVerticesIterator *self,
|
PyObject *PyVerticesIteratorNext(PyVerticesIterator *self,
|
||||||
@ -65,8 +64,7 @@ PyObject *PyVerticesIteratorNext(PyVerticesIterator *self,
|
|||||||
CHECK(self->py_graph->graph);
|
CHECK(self->py_graph->graph);
|
||||||
const auto *vertex = mgp_vertices_iterator_next(self->it);
|
const auto *vertex = mgp_vertices_iterator_next(self->it);
|
||||||
if (!vertex) Py_RETURN_NONE;
|
if (!vertex) Py_RETURN_NONE;
|
||||||
return MakePyVertex(mgp_vertex_copy(vertex, self->py_graph->memory),
|
return MakePyVertex(*vertex, self->py_graph);
|
||||||
self->py_graph);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyMethodDef PyVerticesIteratorMethods[] = {
|
static PyMethodDef PyVerticesIteratorMethods[] = {
|
||||||
@ -94,7 +92,7 @@ struct PyEdgesIterator {
|
|||||||
PyGraph *py_graph;
|
PyGraph *py_graph;
|
||||||
};
|
};
|
||||||
|
|
||||||
PyObject *MakePyEdge(mgp_edge *edge, PyGraph *py_graph);
|
PyObject *MakePyEdge(const mgp_edge &edge, PyGraph *py_graph);
|
||||||
|
|
||||||
void PyEdgesIteratorDealloc(PyEdgesIterator *self) {
|
void PyEdgesIteratorDealloc(PyEdgesIterator *self) {
|
||||||
CHECK(self->it);
|
CHECK(self->it);
|
||||||
@ -114,8 +112,7 @@ PyObject *PyEdgesIteratorGet(PyEdgesIterator *self,
|
|||||||
CHECK(self->py_graph->graph);
|
CHECK(self->py_graph->graph);
|
||||||
const auto *edge = mgp_edges_iterator_get(self->it);
|
const auto *edge = mgp_edges_iterator_get(self->it);
|
||||||
if (!edge) Py_RETURN_NONE;
|
if (!edge) Py_RETURN_NONE;
|
||||||
return MakePyEdge(mgp_edge_copy(edge, self->py_graph->memory),
|
return MakePyEdge(*edge, self->py_graph);
|
||||||
self->py_graph);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject *PyEdgesIteratorNext(PyEdgesIterator *self,
|
PyObject *PyEdgesIteratorNext(PyEdgesIterator *self,
|
||||||
@ -125,8 +122,7 @@ PyObject *PyEdgesIteratorNext(PyEdgesIterator *self,
|
|||||||
CHECK(self->py_graph->graph);
|
CHECK(self->py_graph->graph);
|
||||||
const auto *edge = mgp_edges_iterator_next(self->it);
|
const auto *edge = mgp_edges_iterator_next(self->it);
|
||||||
if (!edge) Py_RETURN_NONE;
|
if (!edge) Py_RETURN_NONE;
|
||||||
return MakePyEdge(mgp_edge_copy(edge, self->py_graph->memory),
|
return MakePyEdge(*edge, self->py_graph);
|
||||||
self->py_graph);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyMethodDef PyEdgesIteratorMethods[] = {
|
static PyMethodDef PyEdgesIteratorMethods[] = {
|
||||||
@ -165,7 +161,7 @@ PyObject *PyGraphGetVertexById(PyGraph *self, PyObject *args) {
|
|||||||
"Unable to find the vertex with given ID.");
|
"Unable to find the vertex with given ID.");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
return MakePyVertex(mgp_vertex_copy(vertex, self->memory), self);
|
return MakePyVertex(*vertex, self);
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject *PyGraphIterVertices(PyGraph *self, PyObject *Py_UNUSED(ignored)) {
|
PyObject *PyGraphIterVertices(PyGraph *self, PyObject *Py_UNUSED(ignored)) {
|
||||||
@ -212,6 +208,7 @@ static PyTypeObject PyGraphType = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
PyObject *MakePyGraph(const mgp_graph *graph, mgp_memory *memory) {
|
PyObject *MakePyGraph(const mgp_graph *graph, mgp_memory *memory) {
|
||||||
|
CHECK(!graph || (graph && memory));
|
||||||
auto *py_graph = PyObject_New(PyGraph, &PyGraphType);
|
auto *py_graph = PyObject_New(PyGraph, &PyGraphType);
|
||||||
if (!py_graph) return nullptr;
|
if (!py_graph) return nullptr;
|
||||||
py_graph->graph = graph;
|
py_graph->graph = graph;
|
||||||
@ -234,6 +231,7 @@ static PyTypeObject PyCypherTypeType = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
PyObject *MakePyCypherType(const mgp_type *type) {
|
PyObject *MakePyCypherType(const mgp_type *type) {
|
||||||
|
CHECK(type);
|
||||||
auto *py_type = PyObject_New(PyCypherType, &PyCypherTypeType);
|
auto *py_type = PyObject_New(PyCypherType, &PyCypherTypeType);
|
||||||
if (!py_type) return nullptr;
|
if (!py_type) return nullptr;
|
||||||
py_type->type = type;
|
py_type->type = type;
|
||||||
@ -417,6 +415,7 @@ static PyTypeObject PyQueryModuleType = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
PyObject *MakePyQueryModule(mgp_module *module) {
|
PyObject *MakePyQueryModule(mgp_module *module) {
|
||||||
|
CHECK(module);
|
||||||
auto *py_query_module = PyObject_New(PyQueryModule, &PyQueryModuleType);
|
auto *py_query_module = PyObject_New(PyQueryModule, &PyQueryModuleType);
|
||||||
if (!py_query_module) return nullptr;
|
if (!py_query_module) return nullptr;
|
||||||
py_query_module->module = module;
|
py_query_module->module = module;
|
||||||
@ -541,8 +540,7 @@ PyObject *PyEdgeFromVertex(PyEdge *self, PyObject *Py_UNUSED(ignored)) {
|
|||||||
CHECK(self->py_graph->graph);
|
CHECK(self->py_graph->graph);
|
||||||
const auto *vertex = mgp_edge_get_from(self->edge);
|
const auto *vertex = mgp_edge_get_from(self->edge);
|
||||||
CHECK(vertex);
|
CHECK(vertex);
|
||||||
return MakePyVertex(mgp_vertex_copy(vertex, self->py_graph->memory),
|
return MakePyVertex(*vertex, self->py_graph);
|
||||||
self->py_graph);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject *PyEdgeToVertex(PyEdge *self, PyObject *Py_UNUSED(ignored)) {
|
PyObject *PyEdgeToVertex(PyEdge *self, PyObject *Py_UNUSED(ignored)) {
|
||||||
@ -552,8 +550,7 @@ PyObject *PyEdgeToVertex(PyEdge *self, PyObject *Py_UNUSED(ignored)) {
|
|||||||
CHECK(self->py_graph->graph);
|
CHECK(self->py_graph->graph);
|
||||||
const auto *vertex = mgp_edge_get_to(self->edge);
|
const auto *vertex = mgp_edge_get_to(self->edge);
|
||||||
CHECK(vertex);
|
CHECK(vertex);
|
||||||
return MakePyVertex(mgp_vertex_copy(vertex, self->py_graph->memory),
|
return MakePyVertex(*vertex, self->py_graph);
|
||||||
self->py_graph);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PyEdgeDealloc(PyEdge *self) {
|
void PyEdgeDealloc(PyEdge *self) {
|
||||||
@ -598,17 +595,22 @@ static PyTypeObject PyEdgeType = {
|
|||||||
|
|
||||||
/// Create an instance of `_mgp.Edge` class.
|
/// Create an instance of `_mgp.Edge` class.
|
||||||
///
|
///
|
||||||
/// The ownership of the edge is given to the created instance and will be
|
|
||||||
/// destroyed once the instance itself is destroyed, taking care that the
|
|
||||||
/// execution context is still valid.
|
|
||||||
///
|
|
||||||
/// The created instance references an existing `_mgp.Graph` instance, which
|
/// The created instance references an existing `_mgp.Graph` instance, which
|
||||||
/// marks the execution context.
|
/// marks the execution context.
|
||||||
PyObject *MakePyEdge(mgp_edge *edge, PyGraph *py_graph) {
|
PyObject *MakePyEdge(const mgp_edge &edge, PyGraph *py_graph) {
|
||||||
CHECK(edge->GetMemoryResource() == py_graph->memory->impl);
|
CHECK(py_graph);
|
||||||
|
CHECK(py_graph->graph && py_graph->memory);
|
||||||
|
auto *edge_copy = mgp_edge_copy(&edge, py_graph->memory);
|
||||||
|
if (!edge_copy) {
|
||||||
|
PyErr_SetString(PyExc_MemoryError, "Unable to allocate mgp_edge.");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
auto *py_edge = PyObject_New(PyEdge, &PyEdgeType);
|
auto *py_edge = PyObject_New(PyEdge, &PyEdgeType);
|
||||||
if (!py_edge) return nullptr;
|
if (!py_edge) {
|
||||||
py_edge->edge = edge;
|
mgp_edge_destroy(edge_copy);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
py_edge->edge = edge_copy;
|
||||||
py_edge->py_graph = py_graph;
|
py_edge->py_graph = py_graph;
|
||||||
Py_INCREF(py_graph);
|
Py_INCREF(py_graph);
|
||||||
return PyObject_Init(reinterpret_cast<PyObject *>(py_edge), &PyEdgeType);
|
return PyObject_Init(reinterpret_cast<PyObject *>(py_edge), &PyEdgeType);
|
||||||
@ -764,11 +766,20 @@ static PyTypeObject PyVertexType = {
|
|||||||
.tp_richcompare = PyVertexRichCompare,
|
.tp_richcompare = PyVertexRichCompare,
|
||||||
};
|
};
|
||||||
|
|
||||||
PyObject *MakePyVertex(mgp_vertex *vertex, PyGraph *py_graph) {
|
PyObject *MakePyVertex(const mgp_vertex &vertex, PyGraph *py_graph) {
|
||||||
CHECK(vertex->GetMemoryResource() == py_graph->memory->impl);
|
CHECK(py_graph);
|
||||||
|
CHECK(py_graph->graph && py_graph->memory);
|
||||||
|
auto *vertex_copy = mgp_vertex_copy(&vertex, py_graph->memory);
|
||||||
|
if (!vertex_copy) {
|
||||||
|
PyErr_SetString(PyExc_MemoryError, "Unable to allocate mgp_vertex.");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
auto *py_vertex = PyObject_New(PyVertex, &PyVertexType);
|
auto *py_vertex = PyObject_New(PyVertex, &PyVertexType);
|
||||||
if (!py_vertex) return nullptr;
|
if (!py_vertex) {
|
||||||
py_vertex->vertex = vertex;
|
mgp_vertex_destroy(vertex_copy);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
py_vertex->vertex = vertex_copy;
|
||||||
py_vertex->py_graph = py_graph;
|
py_vertex->py_graph = py_graph;
|
||||||
Py_INCREF(py_graph);
|
Py_INCREF(py_graph);
|
||||||
return PyObject_Init(reinterpret_cast<PyObject *>(py_vertex), &PyVertexType);
|
return PyObject_Init(reinterpret_cast<PyObject *>(py_vertex), &PyVertexType);
|
||||||
@ -902,14 +913,8 @@ py::Object MgpValueToPyObject(const mgp_value &value, PyGraph *py_graph) {
|
|||||||
case MGP_VALUE_TYPE_VERTEX:
|
case MGP_VALUE_TYPE_VERTEX:
|
||||||
throw utils::NotYetImplemented("MgpValueToPyObject");
|
throw utils::NotYetImplemented("MgpValueToPyObject");
|
||||||
case MGP_VALUE_TYPE_EDGE: {
|
case MGP_VALUE_TYPE_EDGE: {
|
||||||
// Copy the edge and pass the ownership to the created _mgp.Edge
|
const auto *e = mgp_value_get_edge(&value);
|
||||||
// instance.
|
return py::Object(reinterpret_cast<PyObject *>(MakePyEdge(*e, py_graph)));
|
||||||
auto *e = mgp_edge_copy(mgp_value_get_edge(&value), py_graph->memory);
|
|
||||||
if (!e) {
|
|
||||||
PyErr_NoMemory();
|
|
||||||
return py::Object();
|
|
||||||
}
|
|
||||||
return py::Object(reinterpret_cast<PyObject *>(MakePyEdge(e, py_graph)));
|
|
||||||
}
|
}
|
||||||
case MGP_VALUE_TYPE_PATH:
|
case MGP_VALUE_TYPE_PATH:
|
||||||
throw utils::NotYetImplemented("MgpValueToPyObject");
|
throw utils::NotYetImplemented("MgpValueToPyObject");
|
||||||
|
Loading…
Reference in New Issue
Block a user