Javier,

we don't explicitly write temporary files, but sqlite3 can decide to do so (typically for a "heavy" request like listing all CRS with an order clause in it). https://sqlite.org/c3ref/temp_directory.html mentions "SQLite performs a search for an appropriate temporary file directory.".   Not very helpful. Source code at https://github.com/sqlite/sqlite/blob/da67225f04ad0470b54433fee31baf266e6630ef/src/os_unix.c#L6262 shows it tries in that order (for Unix systems): SQLITE_TMPDIR env var, TMPDIR env var, /var/tmp, /usr/tmp, /tmp and "."

For the embed proj.db, we have https://github.com/OSGeo/PROJ/blob/master/src/memvfs.c#L300  , which basically redirects to the above logic

Even

Le 24/02/2026 à 16:34, Javier Jimenez Shaw via PROJ a écrit :
Hi

We are having problems with sqlite3 and disk while running on iOS. It happens only from time to time. Restarting the application is usually enough.

The first case returns an sqlite3 error 13: "database or disk is full" https://sqlite.org/rescode.html#full
This is the message (trimmed)
Fatal Exception:osgeo::proj::io::FactoryException
SQLite error [ code = 13, msg = database or disk is full ] on SELECT * FROM 
(SELECT
c.auth_name, c.code,c.name <http://c.name>, c.type, c.deprecated, a.west_lon, 
a.south_lat, a.east_lon,
a.north_lat, a.description, NULL,cb.name <http://cb.name> FROM geodetic_crs c 
LEFT JOIN usage u ON
u.object_table_name = 'geodetic_crs'...

And this is the stack trace
8  libc++abi.dylib 0x11bdcstd::__terminate(void (*)()) + 16
9  libc++abi.dylib 0x15314 __cxa_get_exception_ptr + 86
10 libc++abi.dylib 0x152bc 
__cxxabiv1::failed_throw(__cxxabiv1::__cxa_exception*) + 90
11 proj 
0x168434osgeo::proj::io::SQLiteHandle::run(sqlite3_stmt*,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>
 const&,std::__1::list<osgeo::proj::io::SQLValues,std::__1::allocator<osgeo::proj::io::SQLValues>> 
const&, bool) + 1468
12 proj 
0x16a6e8osgeo::proj::io::DatabaseContext::Private::run(std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>
 const&,std::__1::list<osgeo::proj::io::SQLValues,std::__1::allocator<osgeo::proj::io::SQLValues>> 
const&, bool) + 1220
13 proj 0x1ad76cosgeo::proj::io::AuthorityFactory::getCRSInfoList() const + 2332
...

There is another similar (but different) issue with error 10: "disk I/O error" https://sqlite.org/rescode.html#ioerr
Fatal Exception:osgeo::proj::io::FactoryException
SQLite error [ code = 10, msg = disk I/O error ] on SELECT name FROM 
"geodetic_datum" WHERE auth_name = ? AND code = ?

Stack trace

9 libc++abi.dylib 0x11b80 std::terminate() + 108
10 proj 0x8270 __clang_call_terminate + 14
11 proj 0xad1e8 osgeo::proj::common::IdentifiedObject::_isEquivalentTo(osgeo::proj::common::IdentifiedObject const*, osgeo::proj::util::IComparable::Criterion, std::__1::shared_ptr<osgeo::proj::io::DatabaseContext> const&) const + 234 12 proj 0xe82f4 osgeo::proj::datum::Datum::_isEquivalentTo(osgeo::proj::util::IComparable const*, osgeo::proj::util::IComparable::Criterion, std::__1::shared_ptr<osgeo::proj::io::DatabaseContext> const&) const + 100 13 proj 0xed7ac osgeo::proj::datum::GeodeticReferenceFrame::isEquivalentToNoExactTypeCheck(osgeo::proj::util::IComparable const*, osgeo::proj::util::IComparable::Criterion, std::__1::shared_ptr<osgeo::proj::io::DatabaseContext> const&) const + 96 14 proj 0xc0774 osgeo::proj::crs::SingleCRS::baseIsEquivalentTo(osgeo::proj::util::IComparable const*, osgeo::proj::util::IComparable::Criterion, std::__1::shared_ptr<osgeo::proj::io::DatabaseContext> const&) const + 456 15 proj 0xc8eb0 osgeo::proj::crs::GeographicCRS::_isEquivalentTo(osgeo::proj::util::IComparable const*, osgeo::proj::util::IComparable::Criterion, std::__1::shared_ptr<osgeo::proj::io::DatabaseContext> const&) const + 172 16 proj 0xc627c osgeo::proj::crs::GeodeticCRS::identify(std::__1::shared_ptr<osgeo::proj::io::AuthorityFactory> const&) const + 724 17 proj 0xd072c osgeo::proj::crs::ProjectedCRS::identify(std::__1::shared_ptr<osgeo::proj::io::AuthorityFactory> const&) const + 1184 18 proj 0xd4028 osgeo::proj::crs::ProjectedCRS::_identify(std::__1::shared_ptr<osgeo::proj::io::AuthorityFactory> const&) const + 44 ...

Are we writing anything to disk at runtime related to sqlite3? Even a temporary file? Where? If yes, would this problem be fixed if we embed proj.db in the library? Currently we are using it as an external file.

My only guess would be that sqlite3 is creating a temporary file in a folder with very little space (like /tmp), because the phone should have a lot of free space for normal storage.

Thank you
Javier.

_______________________________________________
PROJ mailing list
[email protected]
https://lists.osgeo.org/mailman/listinfo/proj

--
http://www.spatialys.com
My software is free, but my time generally not.
_______________________________________________
PROJ mailing list
[email protected]
https://lists.osgeo.org/mailman/listinfo/proj

Reply via email to