[Tile-serving] [osm2pgsql] Conversion to C++ (#187)
Paul Norman
notifications at github.com
Mon Sep 29 19:53:18 UTC 2014
# C++ osm2pgsql rewrite #
This PR is substantial, as this diff is thousands of lines of additions and removals.
## Summary
* Rewrite in C++98
* Uses boost
* Adds unit tests
* Performance increases
* In-memory pending tracker
* New multi backend, which allows separation of middle tables and rendering tables, and rendering tables to be updated on multiple databases at once, with different styles or lua transforms
## C++98 conversion
osm2pgsql has been rewritten in object-oriented C++98 with use of boost libraries. Any server that someone is contemplating running as rendering server should support this, as other components require support of this. In particular, any setup that can compile Mapnik should compile this without issues.
Despite the substantial rewrite, parts of osm2pgsql are still using C idioms such as ``void *`` pointers.
C++ brings substantial advantages for writing and not having to manually manage memory and prevent reading out of bounds.
**Note:** Do a ``make distclean`` when switching to/from this branch
Fixes #156
## Boost
The version requirement of Boost has been kept to one that Ubuntu 12.04 supports out of the box, and any machine able to run Mapnik 2 should have a recent enough version of Boost.
## Unit test
Unit tests have been added for the portions rewritten in the conversion. This unit test framework can easily be extended.
Fixes #186
## Validation
As our goal was not to change the osm2pgsql output, a validation of the output was conducted with a planet from 130904. The rendering tables were checked for number of rows, area/length, and checks were done with selected tags. Way/relations were checked for number of rows, and total number of array members.
The only variation seen was in middle table tag counts, which was expected. To facilitate addition of the multi-backend it became necessary to move discarding delete tags from the middle to backend. This means that the middle tables have a complete representation of OSM data, regardless of style files.
*Note: Final validation is running, but earlier versions checked out and smaller regression test passed.*
## In-memory pending tracker
Previously osm2pgsql stored a pending flag on the middle ways and relations tables. This was undesirable for a few reasons
* The data didn't need to be persisted between runs
* After any run, pending should have been false for all rows
* MVCC wasn't necessary, so we weren't getting any advantages from PostgreSQL
* Loading into the tables with pending=true then updating pending=false on a later stage lead to significant table and index bloat, including a partial index which was 3.6GB after import instead of empty
* Having pending in-memory made parts of threading easier
On a full planet import, the pending information for all of the ways is approximately 30MB, so memory usage is not an issue.
The move from in-db to in-memory for the middle was a gain of 7% on single-threaded middle ways, on top of earlier gains in other stages, and overall gains from having smaller less bloated tables.
Fixes #105
Fixes #111
## Multi-backend
The new multi-backend has been developed for situations involving multiple database servers. It allows the middle slim tables to be in a different database than the rendering tables. This allows the rendering tables to be replicated with PostgreSQL replication without also replicating the slim tables, the rendering database servers to be provisioned with less database disk space, and multiple styles to be updated from one osm2pgsql process.
Because of the increased complexity of configuration when multiple servers are involved, the multi-backend takes a JSON file as a configuration, rather than increasing the already excessive number of osm2pgsql command-line options.
This feature is still in development, and will be of interest to only those running multiple rendering databases.
## Performance
Although the conversion to C++ was not done for performance reasons, in practice the use of standard library data structures allows for easier performance gains. Future optimizations should be significantly easier. Overall, there is a performance gain, probably due to in-memory pending.
Performance tests were carried out on the machine used for previous testing (Hetzner EX40-SSD, i7-4770, 32GB RAM, 2x240GB SSD in RAID0) as well as extracts on a lower-end machine (i5-3570 @ 3.4 GHz, 8GB RAM, 500GB 3.5" 7200RPM HDD). These represent one of the fastest possible machines for osm2pgsql imports, and a typical developer desktop with a single mechanical drive.
Unlike some other results, performance numbers **do** include index creation, as that time could be different thanks to in-memory pending changes.
Versions benchmarked were 8fc89648fa877674e889cd26014815a3f029e039 (current master) and 4b6489a755b031d96eeae7b92befa7904d058f4f. Pending relations are not present in a standard import, so do not impact the benchmarks. *Note: Index numbers are still generating, but should not <strong>significantly</strong> depend on the changes, and will certainly be done before discussion is complete.*
Command lines used were
* ``osm2pgsql/osm2pgsql --create --style osm2pgsql/default.style --flat-nodes flat.nodes --cache 20000 --slim --number-processes 8 planet-130904.osm.pbf`` for full planet tests.
* ``osm2pgsql/osm2pgsql --create --style ~/osm2pgsql/default.style --cache 6000 --slim --number-processes 4 germany-140601.osm.pbf``
<table><thead><tr>
<th colspan="2" rowspan="2">Stage</th>
<th colspan="2">8fc89648fa877674e889cd26014815a3f029e039</th>
<th colspan="2">4b6489a755b031d96eeae7b92befa7904d058f4f</th>
<th colspan="2">Change</th>
</tr>
<tr>
<th>i7 SSD</th>
<th>i5 HDD</th>
<th>i7 SSD</th>
<th>i5 HDD</th>
<th>i7 SSD</th>
<th>i5 HDD</th>
</thead>
<tbody>
<tr>
<th rowspan="4">Processing</th><th>Nodes</th>
<td align="right">759</td>
<td align="right">689</td>
<td align="right">1018</td>
<td align="right">699</td>
<td align="right">+34%</td>
<td align="right">+1.5%</td>
</tr>
<tr>
<th>Ways</th>
<td align="right">4315</td>
<td align="right">587</td>
<td align="right">4566</td>
<td align="right">580</td>
<td align="right">+5.8%</td>
<td align="right">-1.2%</td>
</tr>
<tr>
<th>Relations</th>
<td align="right">9863</td>
<td align="right">12210</td>
<td align="right">9187</td>
<td align="right">11636</td>
<td align="right">-6.9%</td>
<td align="right">-4.7%</td>
</tr>
<tr>
<th>Total</th>
<td align="right"><strong>14937</strong></td>
<td align="right"><strong>13486</strong></td>
<td align="right"><strong>14771</strong></td>
<td align="right"><strong>12915</strong></td>
<td align="right"><strong>-1.1</strong></td>
<td align="right"><strong>-4.2%</strong></td>
</tr>
<tr><th colspan="2">Pending Ways</th>
<td align="right"><strong>4989</strong></td>
<td align="right"><strong>2001</strong></td>
<td align="right"><strong>3810</strong></td>
<td align="right"><strong>1287</strong></td>
<td align="right"><strong>-24%</strong></td>
<td align="right"><strong>-36%</strong></td>
</tr>
<tr>
<th colspan="2">Ordering and indexes</th>
<td align="right"><strong>9500</strong></td>
<td align="right"><strong>27976</strong></td>
<td align="right"><strong>###</strong></td>
<td align="right"><strong>###</strong></td>
<td align="right"><strong>+###%</strong></td>
<td align="right"><strong>+###%</strong></td>
</tr>
</tbody>
<tfoot>
<tr>
<th colspan="2">Grand Total</th>
<td align="right"><strong>29467</strong></td>
<td align="right"><strong>43519</strong></td>
<td align="right"><strong>###</strong></td>
<td align="right"><strong>###</strong></td>
<td align="right"><strong>+###%</strong></td>
<td align="right"><strong>+###%</strong></td>
</tr>
</tfoot>
</table>
*Negative percentages are faster*
Note: Germany only needed 2577MB of cache, but I didn't know this number until after I ran the import, but this doesn't effect the conclusions.
## Known issues
The console output is different, and no better than before.
You can merge this Pull Request by running:
git pull https://github.com/MapQuest/osm2pgsql cpp_conversion
Or you can view, comment on it, or merge it online at:
https://github.com/openstreetmap/osm2pgsql/pull/187
-- Commit Summary --
* Started adding unit tests.
* Added first simple tests for middle.
* Added dependency on Boost C++ utility libraries.
* Added test for postgres middle.
* Updated README for new Boost dependency and tests.
* Fix typo in temporary path.
* D'oh, need to be superuser before creating tablespaces.
* Renamed C files to C++ in preparation for destaticification.
* Made `middle` structure use virtual functions. Have not yet touched the output, or rest of the statics yet.
* update regression test to search for contrib sql files (postgis, hstore, spatial_ref_sys) in the event that creating these extension fails. previously this was hardcoded for postgis bits to debian like system. for hstore it used to just fail outright
* fix merge conflict
* Fix bug in use of `strncpy()`.
* Propagate exit status information from the tests out to the test harness correctly.
* Changed `output_t` instances to be of class type with vtables.
* remove a bit of c syntax for initializing the output_t pgsql structs function pointers
* merge unstructification from mla
* Removed some static variables from output-pgsql.
* Made `enable_way_area` not static.
* Make `s_table` not static.
* Made a note that `flagsname` and `tagflags` are OK as statics, and marked them const.
* Wildcard matching should operate on const char arrays.
* turn osmdata_t into a proper object. make parsers call member functions instead of passing osmdata_t object. clean up main by breaking out input function pointer into seprate function call. break out output_t creation into seprate function call. moved cleanup of pointers that osmdata_t holds into its destructor
* add comments to main for input file usage. add comments for style file reading
* Removed a lot of static, global state variables from `output_pgsql_t`.
* Merge remote-tracking branch 'MapQuest/kk_multiback' into mla_multi_backend
* start constifying and destaticifying middle-pgsql
* Removed static allocations from methods in `output_pgsql_t`.
* Don't need extern any more.
* Add very simple escaping test.
* Reserve correct amount of space for pgsql escaping.
* Merge remote-tracking branch 'MapQuest/kk_multiback' into mla_multi_backend
* Don't use `const osmid_t &`.
* Removed statics from `output_gazetteer_t`.
* Fix middle test to find the right postgis extension files.
* Remove statics from `middle_pgsql_t`.
* Removed statics from `middle_ram_t`.
* Removed statics from node cache objects.
* Removed an overlooked static from `middle_pgsql_t`.
* turn tagtransfrom into a proper object for use within output-pgsql as a member. add constness as much as possble to make clearer what changes and what doesnt within a given function
* missed a const on the layers used in tagtransform
* Merge remote-tracking branch 'MapQuest/kk_multiback' into mla_multi_backend
* Removed statics from `build_geometry`.
* Destaticked `expire_tiles` and the projection code.
* pull out global scale and keep it inside output_options. also pull out macrofunctions to util namespace
* Merge remote-tracking branch 'origin/mla_multi_backend' into kk_multiback
* remove main object globals and instantiant them where they are actually used
* simplify main by moving options defaults into the options object. started to work the coupling between osmdata_t parsing and output_t
* construct osmdata as a proper object, no more javaesque init stuff
* move all of the parsing statitics out of osmdata_t and into a parsing delegate and its underlying parsers. move the knowledge about which parser parses what into the delegate. still have a bug somehwere with respect to the tags keyval object
* oops wanted to keep the references of tags from parse delegate to individual parsers
* fix regression where action_t was not being updated on subsequent passes
* make use of proper projection object everywhere instead of storying srs only in options
* tried to move out mid and out from options. move options into out. this way we can pull them out of eachother constructors and do this all in osmdata_t. unfortunately i've gotten myself into a chicken and egg thing at present..
* finish removing output_t and middle_t from output_options. now all access between middle and output happen directly. this should make pulling them apart easier (less objects to touch). note that this code is not very nice but its a temporary (possibly even lateral) step towards getting mutiple backends (ie decoupling middle and output)
* Added first pass of moving 'done' logic to output.
* Actually, the gazetteer output doesn't need this.
* Implemented pgsql ID tracker.
* Moved more logic for done/pending status into output.
* Deallocate ways and relations in `stop()`.
* Simulate deleting ways after iteration for compatibilty.
* Add index on id for lookup speed. Still not as fast as before, sadly.
* move options out into its own file. next step make it parse itself and then add tests
* Made parsers call methods on `osmdata_t`.
* Add, modify and delete nodes from mid directly rather than via out.
* merge from mla branch
* Almost removed all mid interactions from out way functions.
* Removed calls into mid from out for relations.
* let options pass back the input middle and output that will be used. move exit_nicely to the util namespace. ready to add options parsing tests
* make testing options easier by not letting it terminate the program but rather throw and be caught in main/tests
* add test for parsing options
* add first test case for options parsing. now more to follow
* Change pgsql output to get information from middle about pending relations from ways rather than modifying the middle.
* Moved `start`, `stop` and `commit` to `osmdata_t`.
* not yet done with random options permutations but lots of other tests are done
* Starting to split out `iterate_*` functionality.
* Added subdir-objects automake option to keep it happy with newer automake version in Ubuntu 14.04.
* Moved call to mid in interations out to `osmdata_t`.
* finish up random permutation test for options
* Iterate in `osmdata_t`, so that multiple can be handled.
* Removed references to `output_t` from middles. Note this also removes the "helper processes" from way & relation iteration, which will have to be added back in another commit.
* move some fundamental table operations into the table class. change options hstore columns to a vector for easier use
* Use a (base) query interface so that outputs cannot perform modifying operations on the middle.
* move table functions out into their own file. move back tag exporting as it has some custom flag logic built in from output_pgsql_t flags
* forgot to add table sources
* Merge remote-tracking branch 'MapQuest/kk_multiback' into mla_multi_backend
* Merge remote-tracking branch 'MapQuest/kk_multiback' into mla_multi_backend
* Merge remote-tracking branch 'MapQuest/kk_multiback' into mla_multi_backend
* remove superfluous methods in output close and connect when these operations were actually happening in other methods. move factory methods for middle and output to static base methods reduces annoying forward declarations and is cleaner. still lots of pulling left to do from output_pgsql_t to table_t to go though
* reorganize output_pgsql_t::start so that we might be able to stop it from accessing the tables connection directly
* Use `const middle_query_t *` everywhere in the output classes.
* Move `shared_ptr` header to parse, as it is not needed in osmtypes.
* Added first pass attempt at `output_multi_t`.
* Use C++ `std::string`s in `options_t`.
* Made `output_t` own a copy of the `options_t` object.
* Hook up `output_multi_t` to the `output_t` factory.
* move as much as possible into table_t all of the sql interactions. exception being the threaded stopping stuff. which will be next on the block. also removed count from taginfo as it wasnt really used and prevented moving the logic into table_t
* merge mla branch and kk branch
* s/srs/srid/
* Finished hooking up output multi.
* Use the same `write_wkt` function for writing nodes.
* move all psql interaction to table_t object. next step is to remove passing around references to string buffers and a few other clean up items
* Merge remote-tracking branch 'MapQuest/kk_multiback' into mla_multi_backend
* Throw explanatory message rather than abort.
* remove passing around of copy values sql string buffer and use only locally
* Added point processor for multi-table output.
* Merge remote-tracking branch 'MapQuest/kk_multiback' into mla_multi_backend
* Store and use multiple outputs.
* Add (really unimaginative) test for multi-table output.
* fix a bunch of warnings. reinstate a controllable buffer
* Merge remote-tracking branch 'origin/mla_multi_backend' into kk_multiback
* remove cleanup methods as they do nothing. restructure table_t to make private more methods and only expose the more used ones. clean up formatting a bit to make it a little faster
* change the interface in build_geometry so that it can be better used by the geometry processors change their interface as well. need to add tests for line processor. changed name of build_geometry to geometry_builder
* add tests for multi output lines. next up polygons
* add setup for processor-polygon
* add an in memory id tracker for pending ways and rels brings performance way back up at the cost of memory of course. start adding pending tracking to output multi.
* forgot to add the actual source for the id tracker
* Pass `export_list` by reference, not pointer.
* Add options to control Lua function names.
* Experimental ID tracker implementation.
* turn text tree into a proper object so as to associate its life to with that single object as used in keyvals and not have to initialize it in various other places. add a member helper to output_multi so as to manage relations and possibly hand them off to geometry processors without having those processors need to worry about tags and filtering
* Merge remote-tracking branch 'origin/mla_multi_backend' into kk_multiback
* Add comments about the three major phases of osm2pgsql
* Merge remote-tracking branch 'mapquest/kk_multiback' into pn_multiback
* get polygons into the multi output
* Add basic comments to run_internal_until
* Merge remote-tracking branch 'mapquest/kk_multiback' into pn_multiback
* protect against out of bounds read
* Merge remote-tracking branch 'origin/pn_multiback' into kk_multiback
* let the caller of geometry builder specify if they want just polygons or just lines instead of only allowing them to get both and then determine what came out with string matching
* got pending tracking into output_multi_t. polygons also seem to be working now except that they are taking too many ways from relations. need to fix that next
* oops polygon processor wasnt looking for polygons..
* add strict mode to tag transform basic filtering so as to remove any special case processing/manipulation for the output-multi object. this way it only exports and validates tags found in the export list. also change tag transform matching for relation members to allow typeless relations. this is needed because the intial relation filtering that output-multi does (which only exports tags specified by the user) will strip the type tag (if not in the export list) from a relation before sending it on to the relation member filtering.
* add expiry/dirty to output-multi. move geometry helpers into geometry-processor
* since middle is not seprate from out we are now keeping all way tags in middle (ie sans filtering) that means that when an out gets at a way through the middle it cant expect its particular important tags to be the only ones there. therefore each out must filter using its own transform/export list before using a way
* keep track (in mem) of pending ways and rels due to node changes
* hook up a bunch of the other scenarios in which ways or rels get marked pending (in memory)
* hook up in memory tracker for actually sending pending items to the outputs/backends
* clean out in db pending ways and rels for middle. still one more round of cleanup to do with actual table def and prepared statements
* Merge remote-tracking branch 'origin/kk_multiback' into kk_multiback
* add some small bookkeeping to id tracker to know how many marks it is carrying at any one time. clean out the rest of the db stuff that was there for pending
* use a hashmap for matching queried nodes to the in memory list via id
* more copy elision
* add some threading deps
* need the threading deps linked as well
* a performance step back but simplify the hand off between middle pending and backend pending. this should allow us to treat every job we push into the queue the same. after we've got it threaded we can go back and redesign it to query multiple ids at a time and do batches or whatever means we deem fit
* start implementing threadsafe reading from middle
* add middle interface for per thread use
* simplify the middle instance per thread stuff
* need newer version of boost for lockfree queue
* make MOAR copy constructors although because we are using pointer to parent class output_t we will need to change to having a pure virtual clone method.. to actually use this in the threads
* Test should use local files.
* Abstract `expire_tiles` output.
* Check that we have lua and protobuf before relying on types from them
* Merge pull request #5 from pnorman/threadpend_luapbf
* Fixed use-after-free bug.
* Started adding basic expiry tests.
* More test infrastructure.
* Added expiry tree merging.
* Added tests covering more code paths.
* Added comments.
* Merge commit 'b59765e3ac591ff84f21f4a1153e7c18a2d2b855' into cpp_merge
* Add clone methods to output classes, which create clones using the copy constructors.
* Merge branch 'master' into cpp_merge
* Merge pull request #7 from MapQuest/cpp_merge
* Add test for pgsql output.
* Merge remote-tracking branch 'origin/kk_threadpend' into jh_threadpend
* Merge remote-tracking branch 'zerebubuth/landuse_test_fix' into jh_threadpend
* Merge pull request #8 from MapQuest/mla_threadpend_tests
* Merge remote-tracking branch 'origin/jh_threadpend' into jh_threadpend
* Merge remote-tracking branch 'origin/mla_threadpend' into jh_threadpend
* Merge pull request #6 from MapQuest/mla_threadpend
* Merge remote-tracking branch 'origin/kk_threadpend' into jh_threadpend
* Combine base classes way_cb_func and rel_cb_func into single base class cb_func. Move thread handling out of middle_t into osmtypes.cpp.
* Threaded pending process work in progress.
* Merge expires on stop in multi and pgsql outputs.
* Use cloned middle in cloned outputs.
* Need to include std set in test-expire-tiles.
* Populate pending job queue prior to cloning out the middles and outputs.
* change around output map to be a vector with the index in the vector being the id of the output so the threads can simply index into their vector of outputs
* remove some of the native pointers and finish up moving pending rels from threads back to main outputs
* refactored a bunch of native pointers to smart ones. tests still failing for relations need to check old branch to see exepcted pending counts
* remove pending tracking from the ram middle processing as now the middle has all ways nodes relations in it
* make clone test pass
* text tree is manditory but we need to stop it from being a global
* Remove way callbacks which are no longer needed.
* all tests passing with non global text_tree. but performance shouldnt be very good
* use threading from the options object not hardcoded
* Remove relation callbacks and replace with threaded relation processing.
* Merge remote-tracking branch 'origin/jh_threadpend' into jh_threadpend
* fix up pending way processing screen output
* Merge remote-tracking branch 'origin/jh_threadpend' into jh_threadpend
* make the rel pending screen output proper
* clean up pending rel printouts
* dont add bogus ids to the pending threads' work queue
* add a test for way area missing
* fix up ram cache misses in pending for middle_pgsql_t
* fix a bug where threaded pending would not have access to the information about which ways were determined to be used in relations beforehand which would have lead to more ways in the lines table for example
* dont set way done tracker when reprocessing relations as no one cares about it and it would be thread contention
* add failing test for route relations duplication in lines table
* get osm2pgsql working again with threaded pending. more perf stuff to do
* parallelize the indexing between middles and outs at the end of pendin gprocessing
* attempt to remove the atomic and lockfree requirements which allows us to target earlier boost version of 1.49, specifically because aparently a lot of people are still using ubuntu 12.04.5
* forgot to ifdef around the atomic headers
* Merge pull request #12 from MapQuest/kk_reduceboostversion
-- File Changes --
M .gitignore (24)
M Makefile.am (152)
M README.md (35)
R UTF8sanitizer.cpp (12)
R binarysearcharray.cpp (13)
R binarysearcharray.hpp (0)
A buffer.cpp (156)
A buffer.hpp (28)
D build_geometry.h (48)
M configure.ac (9)
R expire-tiles.cpp (306)
D expire-tiles.h (14)
A expire-tiles.hpp (63)
R geometry-builder.cpp (563)
A geometry-builder.hpp (67)
A geometry-processor.cpp (156)
A geometry-processor.hpp (98)
A id-tracker.cpp (176)
A id-tracker.hpp (27)
R input.cpp (119)
D input.h (11)
A input.hpp (13)
R keyvals.cpp (165)
D keyvals.h (41)
A keyvals.hpp (51)
A m4/ax_boost_asio.m4 (110)
A m4/ax_boost_base.m4 (272)
A m4/ax_boost_filesystem.m4 (118)
A m4/ax_boost_system.m4 (120)
A m4/ax_boost_thread.m4 (149)
D middle-pgsql.c (1830)
A middle-pgsql.cpp (1469)
D middle-pgsql.h (14)
A middle-pgsql.hpp (107)
D middle-ram.c (387)
A middle-ram.cpp (369)
D middle-ram.h (14)
A middle-ram.hpp (86)
A middle.cpp (26)
D middle.h (49)
A middle.hpp (78)
R node-persistent-cache-reader.cpp (70)
R node-persistent-cache.cpp (187)
D node-persistent-cache.h (29)
A node-persistent-cache.hpp (64)
R node-ram-cache.cpp (117)
D node-ram-cache.h (53)
A node-ram-cache.hpp (87)
A options.cpp (540)
A options.hpp (88)
D osm2pgsql.c (796)
A osm2pgsql.cpp (128)
A osmdata.cpp (406)
A osmdata.hpp (37)
D osmtypes.h (82)
A osmtypes.hpp (37)
R output-gazetteer.cpp (526)
D output-gazetteer.h (8)
A output-gazetteer.hpp (79)
A output-multi.cpp (436)
A output-multi.hpp (84)
D output-null.c (75)
A output-null.cpp (92)
D output-null.h (11)
A output-null.hpp (41)
D output-pgsql.c (1488)
A output-pgsql.cpp (768)
D output-pgsql.h (27)
A output-pgsql.hpp (90)
A output.cpp (161)
D output.h (82)
A output.hpp (77)
R parse-o5m.cpp (184)
R parse-o5m.hpp (13)
R parse-pbf.cpp (215)
R parse-pbf.hpp (28)
R parse-primitive.cpp (254)
R parse-primitive.hpp (17)
D parse-xml2.c (410)
A parse-xml2.cpp (427)
D parse-xml2.h (30)
A parse-xml2.hpp (63)
A parse.cpp (227)
A parse.hpp (91)
A pgsql-id-tracker.cpp (151)
A pgsql-id-tracker.hpp (28)
D pgsql.c (133)
A pgsql.cpp (180)
D pgsql.h (14)
A pgsql.hpp (22)
A processor-line.cpp (19)
A processor-line.hpp (16)
A processor-point.cpp (23)
A processor-point.hpp (16)
A processor-polygon.cpp (26)
A processor-polygon.hpp (18)
R rb.cpp (52)
R rb.hpp (2)
R reprojection.cpp (101)
D reprojection.h (27)
A reprojection.hpp (53)
R sanitizer.hpp (0)
R sprompt.cpp (2)
R sprompt.hpp (0)
A table.cpp (555)
A table.hpp (90)
A taginfo.cpp (210)
A taginfo.hpp (10)
A taginfo_impl.hpp (49)
R tagtransform.cpp (897)
D tagtransform.h (29)
A tagtransform.hpp (45)
A tests/common-pg.cpp (166)
A tests/common-pg.hpp (69)
A tests/middle-tests.cpp (176)
A tests/middle-tests.hpp (13)
M tests/regression-test.py (95)
A tests/regression-test.sh (5)
A tests/test-expire-tiles.cpp (365)
A tests/test-middle-pgsql.cpp (80)
A tests/test-middle-ram.cpp (50)
A tests/test-output-multi-line.cpp (126)
A tests/test-output-multi-point-multi-table.cpp (147)
A tests/test-output-multi-point.cpp (121)
A tests/test-output-multi-polygon.cpp (125)
A tests/test-output-pgsql.cpp (311)
A tests/test-parse-options.cpp (297)
A tests/test-parse-xml2.cpp (162)
A tests/test-pgsql-escape.cpp (7)
A tests/test_output_pgsql_route_rel.osm (15)
A tests/test_output_pgsql_way_area.osm (13)
R text-tree.cpp (66)
D text-tree.h (21)
A text-tree.hpp (21)
A util.cpp (10)
A util.hpp (19)
R wildcmp.cpp (6)
R wildcmp.hpp (2)
-- Patch Links --
https://github.com/openstreetmap/osm2pgsql/pull/187.patch
https://github.com/openstreetmap/osm2pgsql/pull/187.diff
---
Reply to this email directly or view it on GitHub:
https://github.com/openstreetmap/osm2pgsql/pull/187
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstreetmap.org/pipermail/tile-serving/attachments/20140929/c1b216d2/attachment-0001.html>
More information about the Tile-serving
mailing list