/** * Attaches a registry database to the registry object. Prior to calling this, * the registry object is not actually connected to the registry. This function * attaches it so it can be queried and manipulated. * * @param [in] reg the registry to attach to * @param [in] path path to the registry db on disk * @param [out] errPtr on error, a description of the error that occurred * @return true if success; false if failure */ int reg_attach(reg_registry* reg, const char* path, reg_error* errPtr) { struct stat sb; int initialized = 1; /* registry already exists */ int can_write = 1; /* can write to this location */ int result = 0; if (reg->status & reg_attached) { reg_throw(errPtr, REG_MISUSE, "a database is already attached to this " "registry"); return 0; } if (stat(path, &sb) != 0) { initialized = 0; if (errno == ENOENT) { char *dirc, *dname; dirc = strdup(path); dname = dirname(dirc); if (stat(dname, &sb) != 0) { can_write = 0; } free(dirc); } else { can_write = 0; } } /* can_write is still true if one of the stat calls succeeded */ if (initialized || can_write) { sqlite3_stmt* stmt = NULL; char* query = sqlite3_mprintf("ATTACH DATABASE '%q' AS registry", path); int r; do { r = sqlite3_prepare_v2(reg->db, query, -1, &stmt, NULL); } while (r == SQLITE_BUSY); if (r == SQLITE_OK) { /* XXX: Busy waiting, consider using sqlite3_busy_handler/timeout */ do { sqlite3_step(stmt); r = sqlite3_reset(stmt); switch (r) { case SQLITE_OK: if (initialized || (create_tables(reg->db, errPtr))) { Tcl_InitHashTable(®->open_entries, sizeof(sqlite_int64)/sizeof(int)); Tcl_InitHashTable(®->open_files, TCL_STRING_KEYS); Tcl_InitHashTable(®->open_portgroups, sizeof(sqlite_int64)/sizeof(int)); reg->status |= reg_attached; result = 1; } break; case SQLITE_BUSY: break; default: reg_sqlite_error(reg->db, errPtr, query); } } while (r == SQLITE_BUSY); sqlite3_finalize(stmt); stmt = NULL; if (result) { result &= update_db(reg->db, errPtr); } } else { reg_sqlite_error(reg->db, errPtr, query); } if (stmt) { sqlite3_finalize(stmt); } sqlite3_free(query); } else { reg_throw(errPtr, REG_CANNOT_INIT, "port registry doesn't exist at " "\"%q\" and couldn't write to this location", path); } return result; }
int main(int argc, char *argv[]) { int fd = 0; userec_t xuser; off_t sz = 0, i = 0, valids = 0; sqlite3 *Db = NULL; sqlite3_stmt *Stmt = NULL, *tranStart = NULL, *tranEnd = NULL; const char *fpath = EMAILDB_PATH; // init passwd sz = dashs(FN_PASSWD); fd = open(FN_PASSWD, O_RDONLY); if (fd < 0 || sz <= 0) { fprintf(stderr, "cannot open %s.\n", FN_PASSWD); return 0; } sz /= sizeof(userec_t); if (argc > 1) fpath = argv[1]; // init emaildb if (regmaildb_open(&Db, fpath) != SQLITE_OK) { fprintf(stderr, "cannot initialize emaildb: %s.\n", fpath); return 0; } if (sqlite3_prepare(Db, "REPLACE INTO emaildb (userid, email) VALUES (lower(?),lower(?));", -1, &Stmt, NULL) != SQLITE_OK || sqlite3_prepare(Db, "BEGIN TRANSACTION;", -1, &tranStart, NULL) != SQLITE_OK || sqlite3_prepare(Db, "COMMIT;", -1, &tranEnd, NULL) != SQLITE_OK) { fprintf(stderr, "SQLite 3 internal error.\n"); return 0; } sqlite3_step(tranStart); sqlite3_reset(tranStart); while (read(fd, &xuser, sizeof(xuser)) == sizeof(xuser)) { i++; // got a record if (strlen(xuser.userid) < 2 || strlen(xuser.userid) > IDLEN) continue; if (strlen(xuser.email) < 5) continue; if (sqlite3_bind_text(Stmt, 1, xuser.userid, strlen(xuser.userid), SQLITE_STATIC) != SQLITE_OK) { fprintf(stderr, "\ncannot prepare userid param.\n"); break; } if (sqlite3_bind_text(Stmt, 2, xuser.email, strlen(xuser.email), SQLITE_STATIC) != SQLITE_OK) { fprintf(stderr, "\ncannot prepare email param.\n"); break; } if (sqlite3_step(Stmt) != SQLITE_DONE) { fprintf(stderr, "\ncannot execute statement.\n"); break; } sqlite3_reset(Stmt); valids ++; if (valids % 10 == 0) fprintf(stderr, "%d/%d (valid: %d)\r", (int)i, (int)sz, (int)valids); if (valids % TRANSCATION_PERIOD == 0) { sqlite3_step(tranEnd); sqlite3_step(tranStart); sqlite3_reset(tranEnd); sqlite3_reset(tranStart); } } if (valids % TRANSCATION_PERIOD) sqlite3_step(tranEnd); if (Stmt != NULL) sqlite3_finalize(Stmt); if (Db != NULL) sqlite3_close(Db); close(fd); return 0; }
bool QgsDistanceArea::setEllipsoid( const QString& ellipsoid ) { QString radius, parameter2; // // SQLITE3 stuff - get parameters for selected ellipsoid // sqlite3 *myDatabase; const char *myTail; sqlite3_stmt *myPreparedStatement; int myResult; // Shortcut if ellipsoid is none. if ( ellipsoid == GEO_NONE ) { mEllipsoid = GEO_NONE; return true; } // Check if we have a custom projection, and set from text string. // Format is "PARAMETER:<semi-major axis>:<semi minor axis> // Numbers must be with (optional) decimal point and no other separators (C locale) // Distances in meters. Flattening is calculated. if ( ellipsoid.startsWith( "PARAMETER" ) ) { QStringList paramList = ellipsoid.split( ":" ); bool semiMajorOk, semiMinorOk; double semiMajor = paramList[1].toDouble( & semiMajorOk ); double semiMinor = paramList[2].toDouble( & semiMinorOk ); if ( semiMajorOk && semiMinorOk ) { return setEllipsoid( semiMajor, semiMinor ); } else { return false; } } // Continue with PROJ.4 list of ellipsoids. //check the db is available myResult = sqlite3_open_v2( QgsApplication::srsDbFilePath().toUtf8().data(), &myDatabase, SQLITE_OPEN_READONLY, NULL ); if ( myResult ) { QgsMessageLog::logMessage( QObject::tr( "Can't open database: %1" ).arg( sqlite3_errmsg( myDatabase ) ) ); // XXX This will likely never happen since on open, sqlite creates the // database if it does not exist. return false; } // Set up the query to retrieve the projection information needed to populate the ELLIPSOID list QString mySql = "select radius, parameter2 from tbl_ellipsoid where acronym='" + ellipsoid + "'"; myResult = sqlite3_prepare( myDatabase, mySql.toUtf8(), mySql.toUtf8().length(), &myPreparedStatement, &myTail ); // XXX Need to free memory from the error msg if one is set if ( myResult == SQLITE_OK ) { if ( sqlite3_step( myPreparedStatement ) == SQLITE_ROW ) { radius = QString(( char * )sqlite3_column_text( myPreparedStatement, 0 ) ); parameter2 = QString(( char * )sqlite3_column_text( myPreparedStatement, 1 ) ); } } // close the sqlite3 statement sqlite3_finalize( myPreparedStatement ); sqlite3_close( myDatabase ); // row for this ellipsoid wasn't found? if ( radius.isEmpty() || parameter2.isEmpty() ) { QgsDebugMsg( QString( "setEllipsoid: no row in tbl_ellipsoid for acronym '%1'" ).arg( ellipsoid ) ); return false; } // get major semiaxis if ( radius.left( 2 ) == "a=" ) mSemiMajor = radius.mid( 2 ).toDouble(); else { QgsDebugMsg( QString( "setEllipsoid: wrong format of radius field: '%1'" ).arg( radius ) ); return false; } // get second parameter // one of values 'b' or 'f' is in field parameter2 // second one must be computed using formula: invf = a/(a-b) if ( parameter2.left( 2 ) == "b=" ) { mSemiMinor = parameter2.mid( 2 ).toDouble(); mInvFlattening = mSemiMajor / ( mSemiMajor - mSemiMinor ); } else if ( parameter2.left( 3 ) == "rf=" ) { mInvFlattening = parameter2.mid( 3 ).toDouble(); mSemiMinor = mSemiMajor - ( mSemiMajor / mInvFlattening ); } else { QgsDebugMsg( QString( "setEllipsoid: wrong format of parameter2 field: '%1'" ).arg( parameter2 ) ); return false; } QgsDebugMsg( QString( "setEllipsoid: a=%1, b=%2, 1/f=%3" ).arg( mSemiMajor ).arg( mSemiMinor ).arg( mInvFlattening ) ); // get spatial ref system for ellipsoid QString proj4 = "+proj=longlat +ellps=" + ellipsoid + " +no_defs"; QgsCoordinateReferenceSystem destCRS; destCRS.createFromProj4( proj4 ); //TODO: createFromProj4 used to save to the user database any new CRS // this behavior was changed in order to separate creation and saving. // Not sure if it necessary to save it here, should be checked by someone // familiar with the code (should also give a more descriptive name to the generated CRS) if ( destCRS.srsid() == 0 ) { QString myName = QString( " * %1 (%2)" ) .arg( QObject::tr( "Generated CRS", "A CRS automatically generated from layer info get this prefix for description" ) ) .arg( destCRS.toProj4() ); destCRS.saveAsUserCRS( myName ); } // // set transformation from project CRS to ellipsoid coordinates mCoordTransform->setDestCRS( destCRS ); // precalculate some values for area calculations computeAreaInit(); mEllipsoid = ellipsoid; return true; }
SqliteQuery::~SqliteQuery() { sqlite3_finalize(preparedStatement_); }