If you are using
brew to manage your postgresql/postgis install, and you suddenly cannot access any postgis functionality, with the error that
rtpostgis-2.0.so cannot be found, check your
json-c version, I had to do
brew switch json-c 0.10
to get it working.
The long and dirty story
I had created a new database, but for some reason I could not add a geometry column, so I was thinking, maybe, somehow my
POSTGIS extension needs to be (re)activated. And when I tried this I got the the obscure error
could not load library "/usr/local/Cellar/postgresql/9.2.3/lib/rtpostgis-2.0.so": dlopen(/usr/local/Cellar/postgresql/9.2.3/lib/rtpostgis-2.0.so, 10): Library not loaded: /usr/local/opt/sqlite/lib/libsqlite220.127.116.11.dylib Referenced from: /usr/local/lib/libgdal.1.dylib
Maybe my postgis installation is somehow corrupt, so I tried
brew install postgis. Wronggggg move. Suddenly I am installing
postgresql 9.3.4 too?
Ok. I did not see an alternative. This of course ment I should upgrade my database. First step: install postgresql 9.3.4 and postgis. Then I tried to follow this upgrade procedure. In short I issued the following commands:
initdb /usr/local/var/postgres9.3 -E utf8 pg_upgrade -d /usr/local/var/postgres -D /usr/local/var/postgres9.3 -b /usr/local/Cellar/postgresql/9.2.3/bin/ -B /usr/local/Cellar/postgresql/9.3.4/bin/ -v
and that failed? I got almost the same error, but now a bit more verbose:
PG::UndefinedFile: ERROR: could not load library "/usr/local/Cellar/postgresql/9.2.3/lib/postgis-2.0.so": dlopen(/usr/local/Cellar/postgresql/9.2.4/lib/postgis-2.0.so, 10): Symbol not found: _json_tokener_errors Referenced from: /usr/local/Cellar/postgresql/9.2.4/lib/postgis-2.0.so Expected in: /usr/local/lib/libjson.0.dylib in /usr/local/Cellar/postgresql/9.2.4/lib/postgis-2.0.so
What? Json? And that led me to the answer: I had to switch my
brew switch json-c 0.10
pg_upgrade which now seemed to work, but failed at the end, that
rtpostgis-2.0.so were not loadable. Sigh. These were of course compiled against the new
json-c (I think?).
I switched the
json-c version back to 0.11 and then I started my postgres process again. This showed my that my databases were NOT upgraded.
This almost feels like dll hell al over again.
Should I uninstall postgis, do
db_upgrade and install it again? Go back to 9.2.3?
For the moment I switched back to 9.2.3 and opened an issue on the homebrew. I hope somebody can help me.
brew switch postgresql 9.2.3 brew switch json-c 0.10
Not sure what will break, because something needed to install
json-c 0.11 ? At least for now I am good. I hope.
[UPDATE] Nope. It only partly works now. The errors I saw were:
brew switch json-c 0.10:
PG::UndefinedFile: ERROR: could not load library “/usr/local/Cellar/postgresql/9.2.3/lib/rtpostgis-2.0.so”: dlopen(/usr/local/Cellar/postgresql/9.2.3/lib/rtpostgis-2.0.so, 10): Library not loaded: /usr/local/lib/libjson-c.2.dylib
Referenced from: /usr/local/opt/liblwgeom/lib/liblwgeom-2.1.1.dylib
Reason: image not found
brew switch json-c 0.11
PG::UndefinedFile: ERROR: could not load library “/usr/local/Cellar/postgresql/9.2.3/lib/postgis-2.0.so”: dlopen(/usr/local/Cellar/postgresql/9.2.3/lib/postgis-2.0.so, 10): Symbol not found: _json_tokener_errors
Referenced from: /usr/local/Cellar/postgresql/9.2.3/lib/postgis-2.0.so
Expected in: /usr/local/lib/libjson.0.dylib
So I was stuck. Reverting to the old version did not fix it.
I was able to get my situation rectified by doing a “clean” install of
postgresql92 which installed postgresql 9.2.8.
brew install postgresql92 brew link --overwrite postgresql92 brew install postgis20 launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
And now I am good. On version 9.2.8. Hehe.
I have no clear conclusion or solution. Somehow my
json-c got upgraded, which messed up my postgis installation. I guess installing the new version of postgis, messed up my old version of postgis (since now one file was linked to json-c.0.11 and the other against json-c.0.10).
However I did find a clean solution: upgrading to postgresql92 and postgis20, now nicely linked against json-c 0.11.
If you encounter the same error: switch your
json-c version, before trying anything else, and then I hope you should be good to go (no need to upgrade).