处理 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
}