Skip to content

Commit 3dae7e5

Browse files
committed
refactor database : integrate sqlite database for object management
1 parent 71e3bb7 commit 3dae7e5

File tree

10 files changed

+86
-55
lines changed

10 files changed

+86
-55
lines changed

src/opengeodeweb_viewer/config.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@
77
def default_config():
88
os.environ["DEFAULT_HOST"] = "localhost"
99
os.environ["DEFAULT_PORT"] = "1234"
10+
os.environ["DATABASE_PATH"] = os.path.join(
11+
os.environ.get("DATA_FOLDER_PATH", "/data/"), "project.db"
12+
)
1013

1114

1215
def prod_config():
1316
default_config()
1417
os.environ["DATA_FOLDER_PATH"] = "/data/"
18+
os.environ["DATABASE_PATH"] = os.path.join("/data/", "project.db")
1519

1620

1721
def dev_config():
@@ -24,6 +28,9 @@ def dev_config():
2428
)
2529
if not os.path.exists(os.environ.get("DATA_FOLDER_PATH")):
2630
os.mkdir(os.environ.get("DATA_FOLDER_PATH"))
31+
os.environ["DATABASE_PATH"] = os.path.join(
32+
os.environ.get("DATA_FOLDER_PATH"), "project.db"
33+
)
2734

2835

2936
def test_config(path):

src/opengeodeweb_viewer/object/object_methods.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,32 @@
55
import vtk
66

77
# Local application imports
8+
from opengeodeweb_viewer.utils_functions import get_schemas_dict, validate_schema
89
from opengeodeweb_viewer.vtk_protocol import VtkView
910

1011

1112
class VtkObjectView(VtkView):
1213
def __init__(self):
1314
super().__init__()
1415

15-
def registerObject(self, id, reader, filter, mapper):
16-
data_info = self.get_data_info(id)
17-
file_path = self.get_data_file_path(id, data_info.viewable_file_name)
16+
def registerObject(self, id):
17+
data = self.get_data_by_id(id)
18+
if not data:
19+
raise Exception(
20+
f"Données avec l'ID {id} non trouvées dans la base de données"
21+
)
22+
23+
reader = vtk.vtkXMLGenericDataObjectReader()
24+
mapper = vtk.vtkDataSetMapper()
25+
mapper.SetInputConnection(reader.GetOutputPort())
1826
actor = vtk.vtkActor()
19-
self.register_object(id, reader, filter, actor, mapper, {})
20-
reader.SetFileName(file_path)
27+
28+
self.register_object(id, reader, {}, actor, mapper, {})
29+
30+
reader.SetFileName(
31+
os.path.join(self.DATA_FOLDER_PATH, id, data["viewable_file_name"])
32+
)
33+
2134
actor.SetMapper(mapper)
2235
mapper.SetColorModeToMapScalars()
2336
mapper.SetResolveCoincidentTopologyLineOffsetParameters(1, -0.1)
@@ -58,7 +71,9 @@ def applyTextures(self, id, textures):
5871

5972
new_texture = vtk.vtkTexture()
6073
image_reader = vtk.vtkXMLImageDataReader()
61-
image_reader.SetFileName(self.get_data_file_path(id, texture_file_name))
74+
image_reader.SetFileName(
75+
os.path.join(self.DATA_FOLDER_PATH, id, texture_file_name)
76+
)
6277

6378
shader_texture_name = f"VTK_TEXTURE_UNIT_{index}"
6479
polydata_mapper.MapDataArrayToMultiTextureAttribute(

src/opengeodeweb_viewer/rpc/generic/generic_protocols.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,11 @@ def register(self, params):
2727
params, self.generic_schemas_dict["register"], self.generic_prefix
2828
)
2929
viewer_object = params["viewer_object"]
30-
data_id = params["data_id"]
31-
data_info = self.get_data_info(data_id)
32-
register_params = {"id": data_id, "file_name": data_info.viewable_file_name}
30+
params.pop("viewer_object", None)
3331
if viewer_object == "mesh":
34-
self.mesh_protocols.registerMesh(register_params)
32+
self.mesh_protocols.registerMesh(params)
3533
elif viewer_object == "model":
36-
self.model_protocols.registerModel(register_params)
34+
self.model_protocols.registerModel(params)
3735

3836
@exportRpc(generic_prefix + generic_schemas_dict["deregister"]["rpc"])
3937
def deregister(self, params):

src/opengeodeweb_viewer/rpc/generic/schemas/register.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,16 @@
1313
"id": {
1414
"type": "string",
1515
"minLength": 1
16+
},
17+
"file_name": {
18+
"type": "string",
19+
"minLength": 1
1620
}
1721
},
1822
"required": [
1923
"viewer_object",
20-
"id"
24+
"id",
25+
"file_name"
2126
],
2227
"additionalProperties": false
2328
}

src/opengeodeweb_viewer/rpc/mesh/mesh_protocols.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,10 @@ def __init__(self):
2222
@exportRpc(mesh_prefix + mesh_schemas_dict["register"]["rpc"])
2323
def registerMesh(self, params):
2424
validate_schema(params, self.mesh_schemas_dict["register"], self.mesh_prefix)
25-
id, file_name = params["id"], params["file_name"]
25+
id = params["id"]
2626
try:
27-
reader = vtk.vtkXMLGenericDataObjectReader()
28-
filter = {}
29-
mapper = vtk.vtkDataSetMapper()
30-
mapper.SetInputConnection(reader.GetOutputPort())
31-
self.registerObject(id, file_name, reader, filter, mapper)
32-
27+
self.registerObject(id)
28+
reader = self.get_object(id)["reader"]
3329
data_object = reader.GetOutput()
3430
data_set = vtk.vtkDataSet.SafeDownCast(data_object)
3531
cell_types = vtk.vtkCellTypes()
@@ -52,6 +48,7 @@ def registerMesh(self, params):
5248
self.get_data_base()[id]["max_dimension"] = max_dimension
5349
except Exception as e:
5450
print("error : ", str(e), flush=True)
51+
raise
5552

5653
@exportRpc(mesh_prefix + mesh_schemas_dict["deregister"]["rpc"])
5754
def deregisterMesh(self, params):

src/opengeodeweb_viewer/rpc/model/model_protocols.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def __init__(self):
2323
@exportRpc(model_prefix + model_schemas_dict["register"]["rpc"])
2424
def registerModel(self, params):
2525
validate_schema(params, self.model_schemas_dict["register"], self.model_prefix)
26-
id = params["id"]
26+
id, file_name = params["id"], params["file_name"]
2727
try:
2828
reader = vtk.vtkXMLMultiBlockDataReader()
2929
filter = vtk.vtkGeometryFilter()
@@ -32,7 +32,7 @@ def registerModel(self, params):
3232
mapper.SetInputConnection(filter.GetOutputPort())
3333
attributes = vtkCompositeDataDisplayAttributes()
3434
mapper.SetCompositeDataDisplayAttributes(attributes)
35-
self.registerObject(id, reader, filter, mapper)
35+
self.registerObject(id, file_name, reader, filter, mapper)
3636
self.get_object(id)["max_dimension"] = "default"
3737
except Exception as e:
3838
print("error : ", str(e), flush=True)

src/opengeodeweb_viewer/rpc/model/schemas/register.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,15 @@
55
"id": {
66
"type": "string",
77
"minLength": 1
8+
},
9+
"file_name": {
10+
"type": "string",
11+
"minLength": 1
812
}
913
},
1014
"required": [
11-
"id"
15+
"id",
16+
"file_name"
1217
],
1318
"additionalProperties": false
1419
}

src/opengeodeweb_viewer/rpc/viewer/viewer_protocols.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ def takeScreenshot(self, params):
112112
validate_schema(
113113
params, self.viewer_schemas_dict["take_screenshot"], self.viewer_prefix
114114
)
115+
115116
filename, output_extension, include_background = (
116117
params["filename"],
117118
params["output_extension"],

src/opengeodeweb_viewer/vtk_protocol.py

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,50 @@
11
# Standard library imports
22
import os
3+
import sqlite3
34

45
# Third party imports
56
import vtk
67
from vtk.web import protocols as vtk_protocols
78

89
# Local application imports
9-
from opengeodeweb_microservice.database.data import Data
10-
from opengeodeweb_microservice.database.connection import get_session
1110

1211

1312
class VtkView(vtk_protocols.vtkWebProtocol):
1413
def __init__(self):
1514
super().__init__()
1615
self.DATA_FOLDER_PATH = os.getenv("DATA_FOLDER_PATH")
16+
# self.DATABASE_PATH = os.getenv("DATABASE_PATH")
1717
self.DataReader = vtk.vtkXMLPolyDataReader()
1818
self.ImageReader = vtk.vtkXMLImageDataReader()
1919

20-
def get_data_info(self, id: str) -> Data:
21-
data_entry = Data.get(id)
22-
if not data_entry:
23-
raise ValueError(f"Data with id {id} not found")
24-
return data_entry
25-
26-
def get_data_file_path(self, id: str, filename: str = "") -> str:
27-
data_entry = self.get_data_info(id)
28-
if filename:
29-
return os.path.join(self.DATA_FOLDER_PATH, id, filename)
30-
return os.path.join(self.DATA_FOLDER_PATH, id, data_entry.native_file_name)
31-
32-
def load_data(self, id: str):
33-
data_entry = self.get_data_info(id)
34-
file_path = self.get_data_file_path(id, data_entry.native_file_name)
35-
36-
# if not os.path.exists(file_path):
37-
# raise FileNotFoundError(f"File not found at {file_path}")
38-
39-
if file_path.endswith(".vtp"):
40-
reader = vtk.vtkXMLPolyDataReader()
41-
elif file_path.endswith(".vti"):
42-
reader = vtk.vtkXMLImageDataReader()
43-
elif file_path.endswith(".vtu"):
44-
reader = vtk.vtkXMLUnstructuredGridReader()
45-
else:
46-
raise ValueError(f"Unsupported file extension for {file_path}")
47-
48-
reader.SetFileName(file_path)
49-
return reader, data_entry.geode_object
50-
5120
def get_data_base(self):
5221
return self.getSharedObject("db")
5322

23+
def get_db_connection(self):
24+
conn = sqlite3.connect(self.DATA_FOLDER_PATH)
25+
conn.row_factory = sqlite3.Row
26+
return conn
27+
28+
def get_data_by_id(self, data_id):
29+
conn = self.get_db_connection()
30+
try:
31+
cursor = conn.cursor()
32+
cursor.execute("SELECT * FROM data WHERE id = ?", (data_id,))
33+
data = cursor.fetchone()
34+
return dict(data) if data else None
35+
finally:
36+
conn.close()
37+
38+
def get_all_data(self):
39+
conn = self.get_db_connection()
40+
try:
41+
cursor = conn.cursor()
42+
cursor.execute("SELECT * FROM data")
43+
data = cursor.fetchall()
44+
return [dict(row) for row in data]
45+
finally:
46+
conn.close()
47+
5448
def get_renderer(self):
5549
return self.getSharedObject("renderer")
5650

src/opengeodeweb_viewer/vtkw_server.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,20 @@ def add_arguments(parser):
5757
default=os.environ.get("DATA_FOLDER_PATH"),
5858
help="Path to the folder where data is stored",
5959
)
60+
# parser.add_argument(
61+
# "--database_path",
62+
# default=os.environ.get("DATABASE_PATH"),
63+
# help="Path to the SQLite database file",
64+
# )
6065

6166
@staticmethod
6267
def configure(args):
6368
# Standard args
6469
_Server.authKey = args.authKey
70+
# if args.data_folder_path:
71+
# os.environ["DATA_FOLDER_PATH"] = args.data_folder_path
72+
# if args.database_path:
73+
# os.environ["DATABASE_PATH"] = args.database_path
6574

6675
def initialize(self):
6776
# Bring used components

0 commit comments

Comments
 (0)