Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CONFIGURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,5 +131,5 @@ If you want to deploy The Rails Port for production use, you'll need to make a f
* The included version of the GPX importer is slow and/or completely inoperable. You should consider using [the high-speed GPX importer](https://git.openstreetmap.org/gpx-import.git/).
* Make sure you generate the i18n files and precompile the production assets: `RAILS_ENV=production rake i18n:js:export assets:precompile`
* Make sure the web server user as well as the rails user can read, write and create directories in `tmp/`.
* If you want to use diff replication then you will need to install the shared library special SQL functions for the `xid_to_int4` function, for which there is no pure SQL alternative. (See the bottom of [INSTALL.md](INSTALL.md))
* If you want to use diff replication then you might want to consider installing the shared library special SQL functions for the `xid_to_int4` function. A pure SQL version is available, but may become a performance issue on large databases with a high rate of changes. Note that you will need a version of PostgreSQL < 9.6 (yes, _less than_) to use `xid` indexing, whether pure SQL or shared library.
* If you expect to serve a lot of `/changes` API calls, then you might also want to install the shared library versions of the SQL functions.
30 changes: 30 additions & 0 deletions db/functions/functions.sql
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,33 @@ BEGIN
RETURN (x << zoom) | y;
END;
$$ LANGUAGE plpgsql IMMUTABLE;

-- xid_to_int4 converts a PostgreSQL transaction ID (xid) to a 32-bit integer
-- which can then be used to efficiently find rows which have changed between
-- two given transactions. This is currently used by Osmosis to extract a
-- stream of edits for "diff replication" **HOWEVER** this is a pain point, as
-- (ab)using the xid in this way is _not_ supported or recommended by Postgres
-- devs. It is preventing us upgrading to PostgreSQL version 10+, and will
-- hopefully be replaced Real Soon Now.
--
-- From the Osmosis distribution by Brett Henderson:
-- https://github.com/openstreetmap/osmosis/blob/master/package/script/contrib/apidb_0.6_osmosis_xid_indexing.sql
CREATE OR REPLACE FUNCTION xid_to_int4(t xid)
RETURNS integer
AS
$$
DECLARE
tl bigint;
ti int;
BEGIN
tl := t;

IF tl >= 2147483648 THEN
tl := tl - 4294967296;
END IF;

ti := tl;

RETURN ti;
END;
$$ LANGUAGE 'plpgsql' IMMUTABLE STRICT;
24 changes: 24 additions & 0 deletions db/structure.sql
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,30 @@ END;
$$;


--
-- Name: xid_to_int4(xid); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION public.xid_to_int4(t xid) RETURNS integer
LANGUAGE plpgsql STRICT
AS $$
DECLARE
tl bigint;
ti int;
BEGIN
tl := t;

IF tl >= 2147483648 THEN
tl := tl - 4294967296;
END IF;

ti := tl;

RETURN ti;
END;
$$;


SET default_tablespace = '';

SET default_with_oids = false;
Expand Down