bool writeAdminRegionsToDatabase(QString const &a0_dbf, QString const &a1_dbf, Kompex::SQLiteStatement * pStmt) { // because shapefiles are evil QTextCodec * codec = QTextCodec::codecForName("windows-1252"); // populate the admin0 temp table { DBFHandle a0_hDBF = DBFOpen(a0_dbf.toLocal8Bit().data(),"rb"); if(a0_hDBF == NULL) { qDebug() << "ERROR: Could not open admin0 dbf file"; return -1; } size_t a0_numRecords = DBFGetRecordCount(a0_hDBF); if(a0_numRecords == 0) { qDebug() << "ERROR: admin0 dbf file has no records!"; return -1; } size_t a0_idx_adm_name = DBFGetFieldIndex(a0_hDBF,"name"); size_t a0_idx_adm_a3 = DBFGetFieldIndex(a0_hDBF,"adm0_a3"); size_t a0_idx_sov_name = DBFGetFieldIndex(a0_hDBF,"sovereignt"); size_t a0_idx_sov_a3 = DBFGetFieldIndex(a0_hDBF,"sov_a3"); size_t a0_idx_type = DBFGetFieldIndex(a0_hDBF,"type"); size_t a0_idx_note = DBFGetFieldIndex(a0_hDBF,"note_adm0"); // create a temporary table we can use to lookup // the admin0 data we want for each admin1 entry pStmt->SqlStatement("CREATE TABLE IF NOT EXISTS temp(" "id INTEGER PRIMARY KEY NOT NULL UNIQUE," "adm_a3 TEXT NOT NULL UNIQUE," "sov_a3 TEXT NOT NULL," "adm_name TEXT," "sov_name TEXT," "type TEXT," "note TEXT);"); pStmt->BeginTransaction(); for(size_t i=0; i < a0_numRecords; i++) { QString s0 = QString::number(i,10); QString s1(codec->toUnicode(DBFReadStringAttribute(a0_hDBF, i, a0_idx_adm_a3))); QString s2(codec->toUnicode(DBFReadStringAttribute(a0_hDBF, i, a0_idx_sov_a3))); QString s3(codec->toUnicode(DBFReadStringAttribute(a0_hDBF, i, a0_idx_adm_name))); QString s4(codec->toUnicode(DBFReadStringAttribute(a0_hDBF, i, a0_idx_sov_name))); QString s5(codec->toUnicode(DBFReadStringAttribute(a0_hDBF, i, a0_idx_type))); QString s6(codec->toUnicode(DBFReadStringAttribute(a0_hDBF, i, a0_idx_note))); QString stmt("INSERT INTO temp(" "id," "adm_a3," "sov_a3," "adm_name," "sov_name," "type," "note) VALUES(" + s0 + "," + "\"" + s1 + "\"," "\"" + s2 + "\"," "\"" + s3 + "\"," "\"" + s4 + "\"," "\"" + s5 + "\"," "\"" + s6 + "\");"); pStmt->SqlStatement(stmt.toStdString()); } pStmt->CommitTransaction(); DBFClose(a0_hDBF); } // populate the admin1 table { DBFHandle a1_hDBF = DBFOpen(a1_dbf.toLocal8Bit().data(),"rb"); if(a1_hDBF == NULL) { qDebug() << "ERROR: Could not open admin1 dbf file"; return false; } size_t a1_numRecords = DBFGetRecordCount(a1_hDBF); if(a1_numRecords == 0) { qDebug() << "ERROR: admin1 dbf file has no records!"; return false; } // open admin1 translation csv if it exists QStringList listAdmin1Subs; QString pathSubs = a1_dbf; pathSubs.chop(4); pathSubs.append("_translations.dat"); bool admin1_csv_sub = getAdmin1TranslationSubs(pathSubs,listAdmin1Subs); if(admin1_csv_sub) { if(listAdmin1Subs.size() == a1_numRecords) { qDebug() << "INFO: Using translation substitute file: "<< pathSubs; } else { qDebug() << "WARN: Translation file has wrong number " "of entries: " << listAdmin1Subs.size(); admin1_csv_sub = false; } } size_t a1_idx_adm_name = DBFGetFieldIndex(a1_hDBF,"name"); size_t a1_idx_adm_a3 = DBFGetFieldIndex(a1_hDBF,"sr_adm0_a3"); size_t a1_idx_sov_a3 = DBFGetFieldIndex(a1_hDBF,"sr_sov_a3"); size_t a1_idx_fclass = DBFGetFieldIndex(a1_hDBF,"featurecla"); size_t a1_idx_adminname = DBFGetFieldIndex(a1_hDBF,"admin"); QStringList listSqlSaveSov; QStringList listSqlSaveAdmin0; QStringList listSqlSaveAdmin1; for(size_t i=0; i < a1_numRecords; i++) { // get the name of this admin1 entry QString admin1_idx = QString::number(i,10); QString admin1_name(codec->toUnicode(DBFReadStringAttribute(a1_hDBF, i, a1_idx_adm_name))); // if the adm1 fclass is an aggregation, minor island or // remainder, we grab the name from another field which // doesn't contain a bunch of additional metadata QString fclass(codec->toUnicode(DBFReadStringAttribute(a1_hDBF, i, a1_idx_fclass))); if(fclass.contains("aggregation") || fclass.contains("minor island") || fclass.contains("remainder")) { admin1_name = QString(codec->toUnicode(DBFReadStringAttribute( a1_hDBF, i, a1_idx_adminname))); } else { // if there's no special feature class than we check // to see if there's a translation substitute available if(admin1_csv_sub && (listAdmin1Subs[i].size() > 0)) { admin1_name = listAdmin1Subs[i]; } } // get the adm_a3,sov_a3 code for this admin1 entry QString adm_a3(codec->toUnicode(DBFReadStringAttribute(a1_hDBF, i, a1_idx_adm_a3))); QString sov_a3(codec->toUnicode(DBFReadStringAttribute(a1_hDBF, i, a1_idx_sov_a3))); // check if the adm_a3 code exists in the temp database QString stmt("SELECT * FROM temp WHERE adm_a3=\""+ adm_a3 + "\";"); pStmt->Sql(stmt.toStdString()); if(pStmt->FetchRow()) { // save admin0 info QString admin0_idx = QString::number(pStmt->GetColumnInt("id"),10); QString admin0_type = QString::fromStdString(pStmt->GetColumnString("type")); QString admin0_note = QString::fromStdString(pStmt->GetColumnString("note")); pStmt->FreeQuery(); // save admin1 info; we currently derive the // disputed field from admin0 type and note fields QString admin1_disputed = "0"; if(admin0_type.contains("Disputed") || admin0_note.contains("Disputed")) { admin1_disputed = "1"; } stmt = QString("INSERT INTO admin1(id,name,disputed,admin0,sov) VALUES(" + admin1_idx + ",\"" + admin1_name + "\"," + admin1_disputed + "," + admin0_idx + "," + admin0_idx + ");"); listSqlSaveAdmin1.push_back(stmt); } else { pStmt->FreeQuery(); // if there isn't a matching adm_a3 code in the temp // database try to get the sovereign state instead stmt = QString("SELECT * FROM temp WHERE sov_a3=\""+ sov_a3 + "\";"); pStmt->Sql(stmt.toStdString()); if(pStmt->FetchRow()) { QString sov_idx = QString::number(pStmt->GetColumnInt("id")); pStmt->FreeQuery(); // since there's no true corresponding entry for // the admin1 region through the adm_a3 code, we // can't test for disputed regions QString admin1_disputed = "0"; // to indicate that no admin0 region data exists // for this entry, we use an index of value -1 QString admin0_idx = "-1"; stmt = QString("INSERT INTO admin1(id,name,disputed,admin0,sov) VALUES(" + admin1_idx + ",\"" + admin1_name + "\"," + admin1_disputed + "," + admin0_idx + "," + sov_idx + ");"); listSqlSaveAdmin1.push_back(stmt); } else { // fail without a matching adm_a3 or sov_a3 pStmt->FreeQuery(); return false; } } } // populate the admin0 and sov tables { QString stmt("SELECT * FROM temp;"); pStmt->Sql(stmt.toStdString()); while(pStmt->FetchRow()) { QString idx = QString::number(pStmt->GetColumnInt("id"),10); QString admin0_name = QString::fromStdString(pStmt->GetColumnString("adm_name")); QString sov_name = QString::fromStdString(pStmt->GetColumnString("sov_name")); stmt = QString("INSERT INTO sov(id,name) VALUES("+ idx + ",\"" + sov_name + "\");"); listSqlSaveSov.push_back(stmt); stmt = QString("INSERT INTO admin0(id,name) VALUES("+ idx + ",\"" + admin0_name + "\");"); listSqlSaveAdmin0.push_back(stmt); } pStmt->FreeQuery(); } // write prepared statements pStmt->BeginTransaction(); for(int i=0; i < listSqlSaveSov.size(); i++) { pStmt->SqlStatement(listSqlSaveSov[i].toUtf8().data()); } pStmt->CommitTransaction(); pStmt->BeginTransaction(); for(int i=0; i < listSqlSaveAdmin0.size(); i++) { pStmt->SqlStatement(listSqlSaveAdmin0[i].toUtf8().data()); } pStmt->CommitTransaction(); pStmt->BeginTransaction(); for(int i=0; i < listSqlSaveAdmin1.size(); i++) { pStmt->SqlStatement(listSqlSaveAdmin1[i].toUtf8().data()); } pStmt->CommitTransaction(); } // delete temp table pStmt->SqlStatement("DROP TABLE temp;"); return true; }
digitalWrite(DHpin,LOW); delay(30); digitalWrite(DHpin,HIGH); delayMicroseconds(40); pinMode(DHpin,INPUT); while(digitalRead(DHpin) == HIGH); delayMicroseconds(80); // if(digitalRead(DHpin) == LOW); delayMicroseconds(80); for(int i=0;i<4;i++) dat[i] = read_data(); pinMode(DHpin,OUTPUT); digitalWrite(DHpin,HIGH); } char fclass::get_Temp(){ //Sensor detection return dat[2]; } char fclass::get_Hum(){ //Sensor detection return dat[0]; } fclass dht = fclass();