sqlite: disassociate extent calculation from rtree auto-index creation, and grab immediate lock on rtree table
This commit is contained in:
parent
3750171680
commit
a4715aa8df
2 changed files with 37 additions and 45 deletions
|
@ -245,13 +245,9 @@ 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())
|
||||||
{
|
{
|
||||||
std::ostringstream query;
|
std::ostringstream query;
|
||||||
|
@ -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
|
||||||
|
@ -275,6 +276,7 @@ void sqlite_datasource::bind() const
|
||||||
<< geometry_table_;
|
<< geometry_table_;
|
||||||
throw datasource_exception(s.str());
|
throw datasource_exception(s.str());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! extent_initialized_)
|
if (! extent_initialized_)
|
||||||
|
|
|
@ -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,34 +202,33 @@ 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);
|
||||||
|
|
||||||
ds->execute("PRAGMA synchronous=OFF");
|
|
||||||
ds->execute("BEGIN TRANSACTION");
|
|
||||||
|
|
||||||
// first drop the index if it already exists
|
|
||||||
std::ostringstream spatial_index_drop_sql;
|
|
||||||
spatial_index_drop_sql << "DROP TABLE IF EXISTS " << index_table;
|
|
||||||
ds->execute(spatial_index_drop_sql.str());
|
|
||||||
|
|
||||||
// create the spatial index
|
|
||||||
std::ostringstream create_idx;
|
|
||||||
create_idx << "create virtual table "
|
|
||||||
<< index_table
|
|
||||||
<< " using rtree(pkid, xmin, xmax, ymin, ymax)";
|
|
||||||
|
|
||||||
// insert for prepared statement
|
|
||||||
std::ostringstream insert_idx;
|
|
||||||
insert_idx << "insert into "
|
|
||||||
<< index_table
|
|
||||||
<< " values (?,?,?,?,?)";
|
|
||||||
|
|
||||||
ds->execute(create_idx.str());
|
|
||||||
|
|
||||||
prepared_index_statement ps(ds,insert_idx.str());
|
|
||||||
|
|
||||||
bool one_success = false;
|
bool one_success = false;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
bool first = true;
|
ds->execute("PRAGMA synchronous=OFF");
|
||||||
|
ds->execute("BEGIN IMMEDIATE TRANSACTION");
|
||||||
|
|
||||||
|
// first drop the index if it already exists
|
||||||
|
std::ostringstream spatial_index_drop_sql;
|
||||||
|
spatial_index_drop_sql << "DROP TABLE IF EXISTS " << index_table;
|
||||||
|
ds->execute(spatial_index_drop_sql.str());
|
||||||
|
|
||||||
|
// create the spatial index
|
||||||
|
std::ostringstream create_idx;
|
||||||
|
create_idx << "create virtual table "
|
||||||
|
<< index_table
|
||||||
|
<< " using rtree(pkid, xmin, xmax, ymin, ymax)";
|
||||||
|
|
||||||
|
// insert for prepared statement
|
||||||
|
std::ostringstream insert_idx;
|
||||||
|
insert_idx << "insert into "
|
||||||
|
<< index_table
|
||||||
|
<< " values (?,?,?,?,?)";
|
||||||
|
|
||||||
|
ds->execute(create_idx.str());
|
||||||
|
|
||||||
|
prepared_index_statement ps(ds,insert_idx.str());
|
||||||
|
|
||||||
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;
|
||||||
|
|
Loading…
Reference in a new issue