处理 GDALVectorTranslate 中的 PostgreSQL 事务错误
Handle PostgreSQL transaction errors in GDALVectorTranslate
在 C++ 中,我使用 GDAL 库将地理空间文件导入 Postgres/PostGIS。
GDAL 库将在 Postgres 数据库中创建一个 table 并插入数据。但是我不知道如何处理插入数据过程中的错误。
我正在使用 GDALVectorTranslate https://gdal.org/api/gdal_utils.html#gdal__utils_8h_1aa176ae667bc857ab9c6016dbe62166eb
如果发生 Postgres 错误,将输出错误文本,程序继续 运行。我想处理这些 Postgres 错误。
错误可能是:
ERROR 1: INSERT command for new feature failed.
ERROR: invalid byte sequence for encoding "UTF8": 0xe5 0x20 0x46
现在我让我的程序计算目标中的行数table,如果为零则假定错误。但是,如果附加到现有的 table.
,那将不起作用
auto *dst = (GDALDataset *) GDALVectorTranslate(nullptr, pgDs, 1, &sourceDs, opt, &bUsageError);
if (dst == nullptr) {
std::cout << "ERROR! Couldn't create table" << std::endl;
return FALSE;
} else {
OGRLayer *layer = dst->GetLayerByName(altName);
// Here the rows are counted
if (layer->GetFeatureCount() == 0) {
std::cout << "ERROR! Insert failed" << std::endl;
return FALSE;
}
std::cout << " Imported";
return TRUE;
}
您可以注册自己的错误处理程序来记录和计算底层错误:
struct {/*members for handling errors*/} ctx;
static void myErrorHandler(CPLErr e, CPLErrorNum n, const char* msg) {
ctx *myctx = (ctx*)CPLGetErrorHandlerUserData();
/* do something with ctx to log and increment error count */
}
int myTranslateFunc() {
ctx myctx; //+initialization
CPLPushErrorHandlerEx(&myErrorHandler,&myctx);
auto *dst = (GDALDataset *) GDALVectorTranslate(nullptr, pgDs, 1, &sourceDs, opt, &bUsageError);
CPLPopErrorHandler();
//inspect myctx for potential errors
}
在 C++ 中,我使用 GDAL 库将地理空间文件导入 Postgres/PostGIS。
GDAL 库将在 Postgres 数据库中创建一个 table 并插入数据。但是我不知道如何处理插入数据过程中的错误。
我正在使用 GDALVectorTranslate https://gdal.org/api/gdal_utils.html#gdal__utils_8h_1aa176ae667bc857ab9c6016dbe62166eb
如果发生 Postgres 错误,将输出错误文本,程序继续 运行。我想处理这些 Postgres 错误。
错误可能是:
ERROR 1: INSERT command for new feature failed.
ERROR: invalid byte sequence for encoding "UTF8": 0xe5 0x20 0x46
现在我让我的程序计算目标中的行数table,如果为零则假定错误。但是,如果附加到现有的 table.
,那将不起作用 auto *dst = (GDALDataset *) GDALVectorTranslate(nullptr, pgDs, 1, &sourceDs, opt, &bUsageError);
if (dst == nullptr) {
std::cout << "ERROR! Couldn't create table" << std::endl;
return FALSE;
} else {
OGRLayer *layer = dst->GetLayerByName(altName);
// Here the rows are counted
if (layer->GetFeatureCount() == 0) {
std::cout << "ERROR! Insert failed" << std::endl;
return FALSE;
}
std::cout << " Imported";
return TRUE;
}
您可以注册自己的错误处理程序来记录和计算底层错误:
struct {/*members for handling errors*/} ctx;
static void myErrorHandler(CPLErr e, CPLErrorNum n, const char* msg) {
ctx *myctx = (ctx*)CPLGetErrorHandlerUserData();
/* do something with ctx to log and increment error count */
}
int myTranslateFunc() {
ctx myctx; //+initialization
CPLPushErrorHandlerEx(&myErrorHandler,&myctx);
auto *dst = (GDALDataset *) GDALVectorTranslate(nullptr, pgDs, 1, &sourceDs, opt, &bUsageError);
CPLPopErrorHandler();
//inspect myctx for potential errors
}