Skip to content

Commit

Permalink
Merge pull request #3291 from lonvia/fix-timezone-handling
Browse files Browse the repository at this point in the history
Fix timezone handling for timestamps from the database
  • Loading branch information
lonvia authored Jan 7, 2024
2 parents f03ec3e + 474d423 commit 88d7ffa
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 4 deletions.
5 changes: 4 additions & 1 deletion nominatim/api/status.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,10 @@ async def get_status(conn: SearchConnection) -> StatusResult:
status.data_updated = await conn.scalar(sql)

if status.data_updated is not None:
status.data_updated = status.data_updated.replace(tzinfo=dt.timezone.utc)
if status.data_updated.tzinfo is None:
status.data_updated = status.data_updated.replace(tzinfo=dt.timezone.utc)
else:
status.data_updated = status.data_updated.astimezone(dt.timezone.utc)

# Database version
try:
Expand Down
15 changes: 12 additions & 3 deletions nominatim/tools/convert_sqlite.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@
"""
Exporting a Nominatim database to SQlite.
"""
from typing import Set
from typing import Set, Any
import datetime as dt
import logging
from pathlib import Path

import sqlalchemy as sa

from nominatim.typing import SaSelect
from nominatim.typing import SaSelect, SaRow
from nominatim.db.sqlalchemy_types import Geometry, IntArray
from nominatim.api.search.query_analyzer_factory import make_query_analyzer
import nominatim.api as napi
Expand Down Expand Up @@ -124,12 +125,20 @@ async def create_word_table(self) -> None:
async def copy_data(self) -> None:
""" Copy data for all registered tables.
"""
def _getfield(row: SaRow, key: str) -> Any:
value = getattr(row, key)
if isinstance(value, dt.datetime):
if value.tzinfo is not None:
value = value.astimezone(dt.timezone.utc)
return value

for table in self.dest.t.meta.sorted_tables:
LOG.warning("Copying '%s'", table.name)
async_result = await self.src.connection.stream(self.select_from(table.name))

async for partition in async_result.partitions(10000):
data = [{('class_' if k == 'class' else k): getattr(r, k) for k in r._fields}
data = [{('class_' if k == 'class' else k): _getfield(r, k)
for k in r._fields}
for r in partition]
await self.dest.execute(table.insert(), data)

Expand Down

0 comments on commit 88d7ffa

Please sign in to comment.