int JSQLInvitationCodeDB::removeInvitationCode(const QString& code)
{
	QSqlQuery query;
	
	QString dn = QSqlDatabase::database().driverName();
	// QSQLITE
	if( dn == "QSQLITE" ){
		PREPARE( query,
				"DELETE FROM "
				TableName
				" where `id` in ( "
				"  select `id` from "
				TableName
				"  where `code` = :code "
				"  order by `id` LIMIT 1 "
				" ) ",
				0);
	}else{
		PREPARE( query,
				"DELETE FROM "
				TableName
				" where code = :code "
				"LIMIT 1",
				0);
	}

	query.bindValue(":code" , code );

	EXEC( query , -1 );

	return query.numRowsAffected();
}
Пример #2
0
/**
 * Setup prepared statements.
 *
 * @param db_conn connection handle to initialize
 * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
 */
static int
postgres_prepare (PGconn *db_conn)
{
  PGresult *result;

#define PREPARE(name, sql, ...)                                 \
  do {                                                          \
    result = PQprepare (db_conn, name, sql, __VA_ARGS__);       \
    if (PGRES_COMMAND_OK != PQresultStatus (result))            \
    {                                                           \
      GNUNET_break (0);                                         \
      PQclear (result); result = NULL;                          \
      return GNUNET_SYSERR;                                     \
    }                                                           \
    PQclear (result); result = NULL;                            \
  } while (0);

  PREPARE ("test_insert",
           "INSERT INTO test_pq ("
           " pub"
           ",sig"
           ",abs_time"
           ",forever"
           ",hash"
           ",vsize"
           ",u16"
           ",u32"
           ",u64"
           ") VALUES "
           "($1, $2, $3, $4, $5, $6,"
            "$7, $8, $9);",
           9, NULL);
  PREPARE ("test_select",
           "SELECT"
           " pub"
           ",sig"
           ",abs_time"
           ",forever"
           ",hash"
	   ",vsize"
           ",u16"
           ",u32"
           ",u64"
           " FROM test_pq"
           " ORDER BY abs_time DESC "
           " LIMIT 1;",
           0, NULL);
  return GNUNET_OK;
#undef PREPARE
}
Пример #3
0
SQLRETURN SRVR_STMT_HDL::Prepare(const SQLValue_def *inSqlString, short inStmtType, short inHoldability,
								 long inQueryTimeout,bool isISUD)
{
	FUNCTION_ENTRY("SRVR_STMT_HDL::Prepare",(""));
	DEBUG_OUT(DEBUG_LEVEL_ENTRY,("  inSqlString='%s'",
		CLI_SQL_VALUE_STR(inSqlString)));
	DEBUG_OUT(DEBUG_LEVEL_ENTRY,("  inStmtType=%s, inHoldability=%d, inQueryTimeout=%ld, isISUD=%d",
		CliDebugStatementType(inStmtType),
		inHoldability,
		inQueryTimeout,isISUD));

	SQLRETURN rc;
	size_t	len;
	this->isISUD = isISUD;
	if (isReadFromModule)	// Already SMD label is found
		CLI_DEBUG_RETURN_SQL(SQL_SUCCESS);
	// cleanup all memory allocated in the previous operations
	cleanupAll();
	sqlString.dataCharset = inSqlString->dataCharset;
	sqlString.dataType = inSqlString->dataType;
	MEMORY_ALLOC_ARRAY(sqlString.dataValue._buffer,unsigned char,inSqlString->dataValue._length+1);
	sqlString.dataValue._length = inSqlString->dataValue._length+1;

	strncpy((char *)sqlString.dataValue._buffer, (const char *)inSqlString->dataValue._buffer, inSqlString->dataValue._length);
	sqlString.dataValue._buffer[inSqlString->dataValue._length] = '\0';
	stmtType = inStmtType;
	holdability = inHoldability;

	CLI_DEBUG_RETURN_SQL(PREPARE(this));
}
Пример #4
0
void update_day_pass2(char *table_name)
{
    int ec, sp_id;
    char *ticker_symbol;

    printf("PASS2\n");

    stmt_q1.sql = Q1;
    ec = PREPARE(adb, stmt_q1);
    if (ec != SQLITE_OK) {
        APPERR("prepare", stmt_q1.sql, ec);
        exit(1);
    }

    do {

        ec = STEP(stmt_q1);
        if (ec == SQLITE_ROW) {

            sp_id = sqlite3_column_int(stmt_q1.stmtp, 0);
            ticker_symbol = (char *)sqlite3_column_text(stmt_q1.stmtp, 1);

            get_stock_prices(sp_id, table_name, ticker_symbol);

        }

    } while (ec == SQLITE_ROW);

    if (ec != SQLITE_DONE) {
        APPERR("step", stmt_q1.sql, ec);
        exit(1);
    }

}
Пример #5
0
void detach(char *dbname)
{
    int ec;

    stmt_detach.sql = DETACH;
    ec = PREPARE(adb, stmt_detach);
    if (ec != SQLITE_OK) {
        APPERR("prepare", stmt_detach.sql, ec);
        exit(1);
    }

    ec = BINDSTR(stmt_detach, 1, dbname);
    if (ec != SQLITE_OK) {
        APPERR("bind", stmt_detach.sql, ec);
        exit(1);
    }

    ec = STEP(stmt_detach);
    if (ec = SQLITE_OK) {
        APPERR("step", stmt_detach.sql, ec);
        exit(1);
    }

    ec = FINALIZE(stmt_detach);
    if (ec = SQLITE_OK) {
        APPERR("finalize", stmt_detach.sql, ec);
        exit(1);
    }
}
Пример #6
0
bool JSQLGameInfoDB::isGameIdExist(JID id)
{
	QSqlQuery query;
	PREPARE( query ,
			"select game_id from gameinfo "
			"where game_id= :gameID" ,
			false );
	
	query.bindValue(":gameID", id);
	
	EXEC( query , false );
	
	if( query.driver()->hasFeature(QSqlDriver::QuerySize) ){
		if(query.size() > 0){
			return true;
		}else{
			return false;
		}
	}else{
		if(query.next()){
			return true;
		}else{
			return false;
		}
	}
}
Пример #7
0
JCode JSQLGameInfoDB::updateGameInfo(const JGameInfo &gameInfo) {
	QSqlQuery query ;
	PREPARE( query ,
			"UPDATE gameinfo SET "
			"game_name = :gameName, "
			"version = :version, "
			"author_id = :authorID, "
			"runner_id = :runnerID, "
			"intro = :introdution, "
			"server_id = :serverID, "
			"download_url = :downUrl "
			"WHERE game_id = :gameID" ,
			EPrepareFailed );
	
	query.bindValue(":gameName", gameInfo.getName());
	query.bindValue(":version", gameInfo.getVersion().getData());
	query.bindValue(":authorID", gameInfo.getAuthor());
	query.bindValue(":runnerID", gameInfo.getRunner());
	query.bindValue(":introdution", gameInfo.getIntroduction());
	query.bindValue(":serverID", gameInfo.getServerId());
	query.bindValue(":downUrl", gameInfo.getDownloadUrl());
	query.bindValue(":gameID", gameInfo.getGameId());
	
	EXEC( query , EExecFailed );
	
	return 0;
}
Пример #8
0
void update_day_pass3(char *table_name)
{
    int ec;

    printf("PASS3: %s\n", table_name);

    attach("analytic.db", "analytic");
    attach("timeSeries.db", "timeSeries");

    stmt_q4.sql = sql_buffer;
    sprintf(sql_buffer, Q4, "analytic", "timeSeries", table_name);
    ec = PREPARE(adb, stmt_q4);
    if (ec != SQLITE_OK) {
        APPERR("prepare", stmt_q4.sql, ec);
        exit(1);
    }

    ec = STEP(stmt_q4);
    if (ec = SQLITE_OK) {
        APPERR("step", stmt_q4.sql, ec);
        exit(1);
    }

    ec = FINALIZE(begin);
    if (ec = SQLITE_OK) {
        APPERR("finalize", stmt_q4.sql, ec);
        exit(1);
    }

    detach("analytic");
    detach("timeSeries");
}
Пример #9
0
JGameInfo JSQLGameInfoDB::getGameInfoById(JID ID) {
	QSqlQuery query ;
	PREPARE( query ,
			"SELECT game_name, "
			"version, "
			"author_id, "
			"runner_id, "
			"intro, "
			"server_id, "
			"download_url "
			"FROM gameinfo "
			"WHERE game_id = :gameID",
			JGameInfo() );
	
	query.bindValue(":gameID", ID);
	
	EXEC(query , JGameInfo() );
	
	if (query.next())
		return JGameInfo(ID,
						 query.value(0).toString(),
						 JVersion((quint32)query.value(1).toInt()),
						 query.value(2).toInt(),
						 query.value(3).toInt(),
						 query.value(4).toString(),
						 query.value(5).toInt(),
						 query.value(6).toString()
						 );
	else
		return JGameInfo();
}
Пример #10
0
bool JSQLUserInfoDB::isUserIdExist(JID id){
	QSqlQuery query;
	PREPARE( query ,
			"select * from userinfo "
			"where user_id = :userId" ,
			false );
	
	query.bindValue(":userId", id);
	
	EXEC( query , false );
	
	if( query.driver()->hasFeature(QSqlDriver::QuerySize) ){
		if(query.size() > 0){
			return true;
		}else{
			return false;
		}
	}else{
		if(query.next()){
			return true;
		}else{
			return false;
		}
	}
}
Пример #11
0
int main(int argc , char * argv[])
{
	int status;
	char * str_err_msg= NULL;
	db_report = stdout;
	printf("sqlite version : %s\n%s\n",sqlite3_libversion(),sqlite3_sourceid());
	//_hdb db;
	connect_db("demo.db");
	//	/**
	PREPARE("create table usrpwd(usr QString, pwd QString)");
	status = sqlite3_exec(db,
				QUERY,
				0,
				0,
				&str_err_msg);
	printf("c->status: %d ~ %s \n",status,str_err_msg);
	/* */
	// /**
	PREPARE("insert into usrpwd values('hkkk','khhh')");
	status = sqlite3_exec(db,
				QUERY,
				0,
				0,
				&str_err_msg);
	printf("c->status: %d ~ %s \n",status,str_err_msg);
	//**/

	PREPARE("select * from usrpwd ");

	status = sqlite3_exec(db,
	QUERY,
	result_handle, // int (*callback)(void*,int,char**,char**),
	0,
	&str_err_msg);
	printf("c->status: %d ~ %s \n",status,str_err_msg);



	status = sqlite3_close(db);
	if(status != SQLITE_OK )
	printf("error:%d\n",sqlite3_errcode(db));
	
	printf("%s",sqlite3_mprintf("%q","it's example"));
	return 0;
}
Пример #12
0
int insert_stock_price(int sp_id, double sp_price, char *sp_date)
{
    int ec;

    stmt_q3.sql = Q3;
    ec = PREPARE(adb, stmt_q3);
    if (ec != SQLITE_OK) {
        APPERR("prepare", stmt_q3.sql, ec);
        exit(1);
    }

    ec = BINDINT(stmt_q3, 1, sp_id);
    if (ec != SQLITE_OK) {
        APPERR("bind sp_id", stmt_q3.sql, ec);
        exit(1);
    }

    ec = BINDDBL(stmt_q3, 2, sp_price);
    if (ec != SQLITE_OK) {
        APPERR("bind sp_price", stmt_q3.sql, ec);
        exit(1);
    }

    ec = BINDSTR(stmt_q3, 3, sp_date);
    if (ec != SQLITE_OK) {
        APPERR("bind sp_date", stmt_q3.sql, ec);
        exit(1);
    }

    ec = STEP(stmt_q3);
    if (ec == SQLITE_DONE) {

        printf("insert of sp_id %d sp_price $%.2f sp_date %s succeeded\n",
                sp_id, sp_price, sp_date);

        ec = FINALIZE(stmt_q3);
        if (ec != SQLITE_OK) {
            APPERR("finalize", stmt_q3.sql, ec);
            exit(1);
        }
        return 1;

    } else if (ec == SQLITE_CONSTRAINT) {

        return 0;

    } else {

        APPERR("STEP", stmt_q3.sql, ec);
        exit(1);

    }
}
/*!
	\brief 插入 root 用户

	参数 \a password 是 root 用户的密码。\n
	成功返回 true , 失败返回 false 。
*/
bool JRootUserInserter::insert(const QString& password) {
    QSqlQuery query ;
    PREPARE( query ,
             "INSERT INTO logininfo "
             "(user_name, passwd, roles) "
             "VALUES(:loginName, :passwd, :roles)" ,
             EPrepareFailed );

    query.bindValue(":loginName", "root");
    query.bindValue(":passwd", password);
    query.bindValue(":roles", 31);

    EXEC( query , EExecFailed );
    return true;
}
Пример #14
0
JGameList JSQLGameInfoDB::getGameList() {
	QSqlQuery query ;
	PREPARE( query ,
			"SELECT game_id, game_name FROM gameinfo",
			JGameList() );
	
	EXEC( query , JGameList() );
	
	JGameList gameList;
	while (query.next()) {
		gameList.insert(query.value(0).toInt(),
						query.value(1).toString()
						);
	}
	return gameList;
}
Пример #15
0
JCode JSQLUserInfoDB::insertUserInfo(const JUserInfo& userInfo){
	QSqlQuery query;
	PREPARE( query ,
			" INSERT INTO userinfo "
			" (user_id,nickname,org) "
			" values(:userId,:nickname,:org) ",
			EPrepareFailed );
	
	query.bindValue(":nickname", userInfo.getNickname());
	query.bindValue(":org", userInfo.getOrganization());
	query.bindValue(":userId", userInfo.getUserId());
	
	EXEC( query , EExecFailed );
	
	return 0 ;
}
JCode JSQLInvitationCodeDB::addInvitationCode(const QString& code)
{
	QSqlQuery query;
	PREPARE( query ,
			"INSERT INTO "
			TableName
			" (code) "
			" values ( :code )",
			EPrepareFailed
			);

	query.bindValue(":code" , code );

	EXEC( query , EExecFailed);

	return 0;
}
Пример #17
0
JCode JSQLUserInfoDB::updateUserInfo(const JUserInfo &userInfo) {
	QSqlQuery query ;
	PREPARE( query ,
			"UPDATE userinfo SET "
			"nickname = :nickname, "
			"org = :org "
			"WHERE user_id = :userID",
			EPrepareFailed
			);
	
	query.bindValue(":nickname", userInfo.getNickname());
	query.bindValue(":org", userInfo.getOrganization());
	query.bindValue(":userID", userInfo.getUserId());
	
	EXEC( query , EExecFailed );
	
	return 0 ;
}
Пример #18
0
JUserInfo JSQLUserInfoDB::getUserInfoById(JID userID) {
	QSqlQuery query ;
	PREPARE( query , 
			"SELECT nickname, org FROM userinfo "
			"WHERE user_id = :userID",
			JUserInfo() );
	
	query.bindValue(":userID", userID);
	
	EXEC( query , JUserInfo() );
	
	if (query.next())
		return JUserInfo(userID,
						 query.value(0).toString(),
						 query.value(1).toString()
						 );
	else
		return JUserInfo();
}
Пример #19
0
void update_day_pass1(char *table_name)
{
    char *ticker_symbol;
    int ec, symbols = 0, inserts = 0;


    stmt_distinctticker.sql = sql_buffer;
    sprintf(sql_buffer, SQL_DISTINCTTICKER, table_name);
    ec = PREPARE(tdb, stmt_distinctticker);
    if (ec != SQLITE_OK) {
        APPERR("prepare", stmt_distinctticker.sql, ec);
        exit(1);
    }

    do {

        ec = STEP(stmt_distinctticker);
        if (ec == SQLITE_ROW) {

            ticker_symbol = (char *)sqlite3_column_text(stmt_distinctticker.stmtp, 0);

            symbols++;
            if (insertTicker(ticker_symbol))
                inserts++;
        }

    } while (ec == SQLITE_ROW);

    printf("PASS1 %s %d %d\n", table_name, symbols, inserts);

    if (ec != SQLITE_DONE) {
        APPERR("step", stmt_distinctticker.sql, ec);
        exit(1);
    }

    ec = FINALIZE(stmt_distinctticker);
    if (ec != SQLITE_OK) {
        APPERR("finalize", stmt_distinctticker.sql, ec);
        exit(1);
    }
}
Пример #20
0
JCode JSQLGameInfoDB::insertGameInfo(const JGameInfo& gameInfo)
{
	QSqlQuery query;
	PREPARE( query ,
			" INSERT INTO gameinfo "
			" (game_id,game_name,version,author_id,runner_id,intro,server_id,download_url) "
			" values(:gameID,:gameName,:version,:authorID,:runnerID,:introduction,:serverID,:downUrl) ",
			EPrepareFailed );
	
	query.bindValue(":gameName", gameInfo.getName());
	query.bindValue(":version", gameInfo.getVersion().getData());
	query.bindValue(":authorID", gameInfo.getAuthor());
	query.bindValue(":runnerID", gameInfo.getRunner());
	query.bindValue(":introduction", gameInfo.getIntroduction());
	query.bindValue(":serverID", gameInfo.getServerId());
	query.bindValue(":downUrl", gameInfo.getDownloadUrl());
	query.bindValue(":gameID", gameInfo.getGameId());
	
	EXEC( query , EExecFailed );
	
	return 0 ;
}
Пример #21
0
int insertTicker(char *ticker_symbol)
{
    int ec;

    if (!strcmp(ticker_symbol, "UnderlyingSymbol"))
        return 0;

    stmt_insertticker.sql = SQL_INSERTTICKER;
    ec = PREPARE(adb, stmt_insertticker);
    if (ec != SQLITE_OK) {
        APPERR("prepare", stmt_insertticker.sql, ec);
        exit(1);
    }

    ec = BINDSTR(stmt_insertticker, 1, ticker_symbol);
    if (ec != SQLITE_OK) {
        APPERR("bind", stmt_insertticker.sql, ec);
        exit(1);
    }

    ec = STEP(stmt_insertticker);
    if (ec == SQLITE_DONE) {
        ec = FINALIZE(stmt_insertticker);
        printf("insert of symbol %s succeeded\n", ticker_symbol);
        if (ec != SQLITE_OK) {
            APPERR("finalize", stmt_insertticker.sql, ec);
            exit(1);
        }
        return 1;
    } else if (ec == SQLITE_CONSTRAINT) {
        return 0;
    } else {
        APPERR("STEP", stmt_insertticker.sql, ec);
        exit(1);
    }


}
Пример #22
0
void end_transaction(void)
{
    int ec;

    end.sql = END;
    ec = PREPARE(adb, end);
    if (ec != SQLITE_OK) {
        APPERR("prepare", end.sql, ec);
        exit(1);
    }

    ec = STEP(end);
    if (ec = SQLITE_OK) {
        APPERR("step", end.sql, ec);
        exit(1);
    }

    ec = FINALIZE(end);
    if (ec = SQLITE_OK) {
        APPERR("finalize", end.sql, ec);
        exit(1);
    }
}
Пример #23
0
void begin_transaction(void)
{
    int ec;

    begin.sql = BEGIN;
    ec = PREPARE(adb, begin);
    if (ec != SQLITE_OK) {
        APPERR("prepare", begin.sql, ec);
        exit(1);
    }

    ec = STEP(begin);
    if (ec = SQLITE_OK) {
        APPERR("step", begin.sql, ec);
        exit(1);
    }


    ec = FINALIZE(begin);
    if (ec = SQLITE_OK) {
        APPERR("finalize", begin.sql, ec);
        exit(1);
    }
}
Пример #24
0
void get_stock_prices(int sp_id, char *table_name, char *symbol)
{
    int ec;
    double stock_price;
    char *data_date;

    stmt_q2.sql = sql_buffer;
    sprintf(sql_buffer, Q2, table_name, symbol);
    ec = PREPARE(tdb, stmt_q2);
    if (ec != SQLITE_OK) {
        APPERR("get_stock_prices:prepare", stmt_q2.sql, ec);
        exit(1);
    }

    do {

        ec = STEP(stmt_q2);
        if (ec == SQLITE_ROW) {
            stock_price = sqlite3_column_double(stmt_q2.stmtp, 0);
            data_date = (char *)sqlite3_column_text(stmt_q2.stmtp, 1);
            insert_stock_price(sp_id, stock_price, data_date);
        }

    } while (ec == SQLITE_ROW);

    if (ec != SQLITE_DONE) {
        APPERR("step", stmt_q2.sql, ec);
        exit(1);
    }

    ec = FINALIZE(stmt_q2);
    if (ec != SQLITE_OK) {
        APPERR("finalize", stmt_q2.sql, ec);
        exit(1);
    }
}
Пример #25
0
/*************  ANTIC mode 00: *********************************
 * generate 1-8 empty scanlines
 ***************************************************************/
void antic_mode_0_xx(VIDEO *video)
{
	PREPARE();
	memset(dst, PBK, HWIDTH*4);
	POST();
}
Пример #26
0
//The following function is converted from the macro with the same name,since it may lead compiling error under
//Microsoft Visual Studio.
static void _findHashEntry(HashTable* table,Object* ptr,Monitor* ptr2,int add_if_absent,int scavenge,int locked)
{                                                                                  
    int hash;                                                                      
    int i;                                                                         
	Thread *self;                                                                  
                                                                                   
	hash = HASH(ptr);                                                              
    if(locked) {                                                                   
        self = threadSelf();                                                       
        lockHashTable0(table, self);                                              
    }                                                                              
                                                                                   
    i = hash & (table->hash_size - 1);                                             
                                                                                   
    for(;;) {                                                                      
        ptr2 = table->hash_table[i].data;                                          
        if((ptr2 == NULL) || (COMPARE(ptr, ptr2, hash, table->hash_table[i].hash))) 
            break;                                                                 
                                                                                   
        i = (i+1) & (table->hash_size - 1);                                        
    }                                                                              
                                                                                   
    if(ptr2) {                                                                     
        ptr2 = FOUND(ptr, ptr2);                                                   
    } else                                                                         
        if(add_if_absent) {                                                        
            table->hash_table[i].hash = hash;                                      
            ptr2 = table->hash_table[i].data = PREPARE(ptr);                       
                                                                                   
            if(ptr2) {                                                             
                table->hash_count++;                                               
                if((table->hash_count * 4) > (table->hash_size * 3)) {             
                    int new_size;                                                  
                    if(scavenge) {                                                 
                        HashEntry *entry = table->hash_table;                      
                        int cnt = table->hash_count;                               
                        for(; cnt; entry++) {                                      
                            void *data = entry->data;                              
                            if(data) {                                             
                                if(SCAVENGE(data)) {                               
                                    entry->data = NULL;                            
                                    table->hash_count--;                           
                                }                                                  
                                cnt--;                                             
                            }                                                      
                        }                                                          
                        if((table->hash_count * 3) > (table->hash_size * 2))       
                            new_size = table->hash_size*2;                         
                        else                                                       
                            new_size = table->hash_size;                           
                    } else                                                         
                        new_size = table->hash_size*2;                             
                                                                                   
                    resizeHash(table, new_size);                                  
                }                                                                 
            }                                                                     
        }                                                                         
                                                                                  
    if(locked)                                                                    
        unlockHashTable0(table, self);                                            
}
Пример #27
0
void update(int pass)
{
    char *tsmd_name;
    int tsmd_rowcnt, tsmd_processed, tsmd_rowid, ec;

    stmt_timeseriesmetadata.sql = SQL_TIMESERIESMETADATA;

    ec = PREPARE(adb, stmt_timeseriesmetadata);
    if (ec != SQLITE_OK) {
        APPERR("prepare", stmt_timeseriesmetadata.sql, ec);
        exit(1);
    }

    do {

        ec = STEP(stmt_timeseriesmetadata);
        if (ec == SQLITE_ROW) {
            /*
             *     0          1            2               3
             * rowid, tsmd_name, tsmd_rowcnt, tsmd_processed
             */
            tsmd_rowid = sqlite3_column_int(stmt_timeseriesmetadata.stmtp, 0);
            tsmd_name = (char *)sqlite3_column_text(stmt_timeseriesmetadata.stmtp, 1);
            tsmd_rowcnt = sqlite3_column_int(stmt_timeseriesmetadata.stmtp, 2);
            tsmd_processed = sqlite3_column_int(stmt_timeseriesmetadata.stmtp, 3);

            printf("Processing rowid %d name %s rowcnt %d processed %d\n",
                    tsmd_rowid, tsmd_name, tsmd_rowcnt, tsmd_processed);


            switch(pass) {

                case 1:
                    update_day_pass1(tsmd_name);
                    break;
                case 2:
                    begin_transaction();
                        update_day_pass2(tsmd_name);
                    end_transaction();
                    break;
                case 3:
                    update_day_pass3(tsmd_name);
                    break;
                default:
                    printf("invalude pass number %d\n", pass);
                    exit(1);
            }
        }

    } while (ec == SQLITE_ROW);

    if (ec != SQLITE_DONE) {
        APPERR("step", stmt_timeseriesmetadata.sql, ec);
        exit(1);
    }

    ec = FINALIZE(stmt_timeseriesmetadata);
    if (ec != SQLITE_OK) {
        APPERR("finalize", stmt_timeseriesmetadata.sql, ec);
        exit(1);
    }

}