#include "spatialite/geopackage.h"
#include "config.h"
#include "geopackage_internal.h"
#ifdef ENABLE_GEOPACKAGE
GEOPACKAGE_PRIVATE void
fnct_gpkgGetNormalRow (sqlite3_context * context, int argc UNUSED,
sqlite3_value ** argv)
{
const unsigned char *table;
int zoom_level;
int inverted_row_number;
int matrix_height;
int normal_row_number;
char *sql_stmt = NULL;
sqlite3 *sqlite = NULL;
char *errMsg = NULL;
char **results;
char *endptr = 0;
int rows = 0;
int columns = 0;
int ret = 0;
if (sqlite3_value_type (argv[0]) != SQLITE_TEXT)
{
sqlite3_result_error (context,
"gpkgGetNormalRow() error: argument 1 [tile_table_name] is not of the String type",
-1);
return;
}
table = sqlite3_value_text (argv[0]);
if (sqlite3_value_type (argv[1]) != SQLITE_INTEGER)
{
sqlite3_result_error (context,
"gpkgGetNormalRow() error: argument 2 [normal zoom level] is not of the integer type",
-1);
return;
}
zoom_level = sqlite3_value_int (argv[1]);
if (sqlite3_value_type (argv[2]) != SQLITE_INTEGER)
{
sqlite3_result_error (context,
"gpkgGetNormalRow() error: argument 3 [inverted_row_number] is not of the integer type",
-1);
return;
}
inverted_row_number = sqlite3_value_int (argv[2]);
sql_stmt =
sqlite3_mprintf
("SELECT matrix_height FROM gpkg_tile_matrix WHERE table_name=\"%q\" AND zoom_level=%i",
table, zoom_level);
sqlite = sqlite3_context_db_handle (context);
ret =
sqlite3_get_table (sqlite, sql_stmt, &results, &rows, &columns,
&errMsg);
sqlite3_free (sql_stmt);
if (ret != SQLITE_OK)
{
sqlite3_result_error (context, errMsg, -1);
sqlite3_free (errMsg);
return;
}
if (rows != 1)
{
sqlite3_result_error (context,
"gpkgGetNormalRow: tile table or zoom level not found",
-1);
sqlite3_free_table (results);
sqlite3_free (errMsg);
return;
}
errno = 0;
matrix_height = strtol (results[1 * columns + 0], &endptr, 10);
if ((endptr == results[1 * columns + 0])
|| (matrix_height < 0)
|| (errno == ERANGE && matrix_height == INT_MAX)
|| (errno != 0 && matrix_height == 0))
{
sqlite3_free_table (results);
sqlite3_result_error (context,
"gpkgGetNormalRow: could not parse result (corrupt GeoPackage?)",
-1);
return;
}
sqlite3_free_table (results);
if ((inverted_row_number >= matrix_height) || (inverted_row_number < 0))
{
sqlite3_result_error (context,
"gpkgGetNormalRow: row number outside of matrix height range",
-1);
return;
}
normal_row_number = matrix_height - inverted_row_number - 1;
sqlite3_result_int (context, normal_row_number);
}
#endif