sqlite: disassociate extent calculation from rtree auto-index creation, and grab immediate lock on rtree table

This commit is contained in:
Dane Springmeyer 2011-11-13 16:02:27 -08:00
parent 3750171680
commit a4715aa8df
2 changed files with 37 additions and 45 deletions

View file

@ -245,12 +245,8 @@ void sqlite_datasource::bind() const
dataset_->execute("attach database '" + index_db + "' as " + index_table_); dataset_->execute("attach database '" + index_db + "' as " + index_table_);
} }
has_spatial_index_ = sqlite_utils::has_rtree(index_table_,dataset_); has_spatial_index_ = sqlite_utils::has_rtree(index_table_,dataset_);
}
if (!has_spatial_index_ && auto_index)
if (! extent_initialized_
&& !has_spatial_index_
&& auto_index)
{ {
if (! key_field_.empty()) if (! key_field_.empty())
{ {
@ -261,9 +257,14 @@ void sqlite_datasource::bind() const
<< " FROM (" << " FROM ("
<< geometry_table_ << ")"; << geometry_table_ << ")";
boost::shared_ptr<sqlite_resultset> rs = dataset_->execute_query(query.str()); boost::shared_ptr<sqlite_resultset> rs = dataset_->execute_query(query.str());
if (sqlite_utils::create_spatial_index(index_db,index_table_,rs,extent_)) if (sqlite_utils::create_spatial_index(index_db,index_table_,rs))
{ {
extent_initialized_ = true; //extent_initialized_ = true;
has_spatial_index_ = true;
if (boost::filesystem::exists(index_db))
{
dataset_->execute("attach database '" + index_db + "' as " + index_table_);
}
} }
} }
else else
@ -276,6 +277,7 @@ void sqlite_datasource::bind() const
throw datasource_exception(s.str()); throw datasource_exception(s.str());
} }
} }
}
if (! extent_initialized_) if (! extent_initialized_)
{ {

View file

@ -182,8 +182,7 @@ public:
static bool create_spatial_index(std::string const& index_db, static bool create_spatial_index(std::string const& index_db,
std::string const& index_table, std::string const& index_table,
boost::shared_ptr<sqlite_resultset> rs, boost::shared_ptr<sqlite_resultset> rs)
mapnik::box2d<double>& extent)
{ {
/* TODO /* TODO
- speedups - speedups
@ -203,8 +202,11 @@ public:
bool existed = boost::filesystem::exists(index_db); bool existed = boost::filesystem::exists(index_db);
boost::shared_ptr<sqlite_connection> ds = boost::make_shared<sqlite_connection>(index_db,flags); boost::shared_ptr<sqlite_connection> ds = boost::make_shared<sqlite_connection>(index_db,flags);
bool one_success = false;
try
{
ds->execute("PRAGMA synchronous=OFF"); ds->execute("PRAGMA synchronous=OFF");
ds->execute("BEGIN TRANSACTION"); ds->execute("BEGIN IMMEDIATE TRANSACTION");
// first drop the index if it already exists // first drop the index if it already exists
std::ostringstream spatial_index_drop_sql; std::ostringstream spatial_index_drop_sql;
@ -227,10 +229,6 @@ public:
prepared_index_statement ps(ds,insert_idx.str()); prepared_index_statement ps(ds,insert_idx.str());
bool one_success = false;
try
{
bool first = true;
while (rs->is_valid() && rs->step_next()) while (rs->is_valid() && rs->step_next())
{ {
int size; int size;
@ -246,15 +244,6 @@ public:
mapnik::box2d<double> const& bbox = paths[i].envelope(); mapnik::box2d<double> const& bbox = paths[i].envelope();
if (bbox.valid()) if (bbox.valid())
{ {
if (first)
{
first = false;
extent = bbox;
}
else
{
extent.expand_to_include(bbox);
}
ps.bind(bbox); ps.bind(bbox);
@ -397,8 +386,9 @@ public:
return true; return true;
} }
} }
catch (...) catch (std::exception const& ex)
{ {
//std::clog << "no: " << ex.what() << "\n";
return false; return false;
} }
return false; return false;