/*! \brief Create DB table from VFKDataBlock (SQLITE only) \param poDataBlock pointer to VFKDataBlock instance */ void VFKReaderSQLite::AddDataBlock(IVFKDataBlock *poDataBlock, const char *pszDefn) { CPLString osCommand, osColumn; VFKPropertyDefn *poPropertyDefn; sqlite3_stmt *hStmt; /* register table in 'vfk_blocks' */ osCommand.Printf("SELECT COUNT(*) FROM vfk_blocks WHERE " "table_name = '%s'", poDataBlock->GetName()); hStmt = PrepareStatement(osCommand.c_str()); if (ExecuteSQL(hStmt) == OGRERR_NONE && sqlite3_column_int(hStmt, 0) == 0) { osCommand.Printf("CREATE TABLE '%s' (", poDataBlock->GetName()); for (int i = 0; i < poDataBlock->GetPropertyCount(); i++) { poPropertyDefn = poDataBlock->GetProperty(i); if (i > 0) osCommand += ","; osColumn.Printf("%s %s", poPropertyDefn->GetName(), poPropertyDefn->GetTypeSQL().c_str()); osCommand += osColumn; } osColumn.Printf(",%s integer", FID_COLUMN); osCommand += osColumn; if (poDataBlock->GetGeometryType() != wkbNone) { osColumn.Printf(",%s blob", GEOM_COLUMN); osCommand += osColumn; } osCommand += ")"; ExecuteSQL(osCommand.c_str()); /* CREATE TABLE */ osCommand.Printf("INSERT INTO 'vfk_blocks' (file_name, table_name, " "num_records, num_geometries, table_defn) VALUES " "('%s', '%s', -1, 0, '%s')", m_pszFilename, poDataBlock->GetName(), pszDefn); ExecuteSQL(osCommand.c_str()); sqlite3_finalize(hStmt); } return VFKReader::AddDataBlock(poDataBlock, NULL); }
/*! \brief Create DB table from VFKDataBlock (SQLITE only) \param poDataBlock pointer to VFKDataBlock instance */ void VFKReaderSQLite::AddDataBlock(IVFKDataBlock *poDataBlock, const char *pszDefn) { const char *pszBlockName; const char *pszKey; CPLString osCommand, osColumn; bool bUnique; VFKPropertyDefn *poPropertyDefn; sqlite3_stmt *hStmt; bUnique = !CPLTestBool(CPLGetConfigOption("OGR_VFK_DB_IGNORE_DUPLICATES", "NO")); pszBlockName = poDataBlock->GetName(); /* register table in VFK_DB_TABLE */ osCommand.Printf("SELECT COUNT(*) FROM %s WHERE " "table_name = '%s'", VFK_DB_TABLE, pszBlockName); hStmt = PrepareStatement(osCommand.c_str()); if (ExecuteSQL(hStmt) == OGRERR_NONE && sqlite3_column_int(hStmt, 0) == 0) { osCommand.Printf("CREATE TABLE '%s' (", pszBlockName); for (int i = 0; i < poDataBlock->GetPropertyCount(); i++) { poPropertyDefn = poDataBlock->GetProperty(i); if (i > 0) osCommand += ","; osColumn.Printf("%s %s", poPropertyDefn->GetName(), poPropertyDefn->GetTypeSQL().c_str()); osCommand += osColumn; } osColumn.Printf(",%s integer", FID_COLUMN); osCommand += osColumn; if (poDataBlock->GetGeometryType() != wkbNone) { osColumn.Printf(",%s blob", GEOM_COLUMN); osCommand += osColumn; } osCommand += ")"; ExecuteSQL(osCommand.c_str()); /* CREATE TABLE */ /* create indices */ osCommand.Printf("%s_%s", pszBlockName, FID_COLUMN); CreateIndex(osCommand.c_str(), pszBlockName, FID_COLUMN, !EQUAL(pszBlockName, "SBP")); pszKey = ((VFKDataBlockSQLite *) poDataBlock)->GetKey(); if (pszKey) { osCommand.Printf("%s_%s", pszBlockName, pszKey); CreateIndex(osCommand.c_str(), pszBlockName, pszKey, bUnique); } if (EQUAL(pszBlockName, "SBP")) { /* create extra indices for SBP */ CreateIndex("SBP_OB", pszBlockName, "OB_ID", FALSE); CreateIndex("SBP_HP", pszBlockName, "HP_ID", FALSE); CreateIndex("SBP_DPM", pszBlockName, "DPM_ID", FALSE); CreateIndex("SBP_OB_HP_DPM", pszBlockName, "OB_ID,HP_ID,DPM_ID", bUnique); CreateIndex("SBP_OB_POR", pszBlockName, "OB_ID,PORADOVE_CISLO_BODU", FALSE); CreateIndex("SBP_HP_POR", pszBlockName, "HP_ID,PORADOVE_CISLO_BODU", FALSE); CreateIndex("SBP_DPM_POR", pszBlockName, "DPM_ID,PORADOVE_CISLO_BODU", FALSE); } else if (EQUAL(pszBlockName, "HP")) { /* create extra indices for HP */ CreateIndex("HP_PAR1", pszBlockName, "PAR_ID_1", FALSE); CreateIndex("HP_PAR2", pszBlockName, "PAR_ID_2", FALSE); } else if (EQUAL(pszBlockName, "OB")) { /* create extra indices for OP */ CreateIndex("OB_BUD", pszBlockName, "BUD_ID", FALSE); } /* update VFK_DB_TABLE meta-table */ osCommand.Printf("INSERT INTO %s (file_name, table_name, " "num_records, num_features, num_geometries, table_defn) VALUES " "('%s', '%s', -1, 0, 0, '%s')", VFK_DB_TABLE, m_pszFilename, pszBlockName, pszDefn); ExecuteSQL(osCommand.c_str()); sqlite3_finalize(hStmt); } return VFKReader::AddDataBlock(poDataBlock, NULL); }