Crazy Bug

This commit is contained in:
Daniel Larimer 2015-07-13 17:24:25 -04:00
parent 0beeac94aa
commit 3b1fb47872
3 changed files with 53 additions and 16 deletions

View file

@ -18,7 +18,7 @@ Account* ChainDataModel::getAccount(qint64 id)
auto acct = new Account(this); auto acct = new Account(this);
acct->setProperty("id", id); acct->setProperty("id", id);
acct->setProperty("name", "LOADING"); acct->setProperty("accountName", "LOADING");
auto insert_result = m_accounts.insert( acct ); auto insert_result = m_accounts.insert( acct );
/** execute in app thread */ /** execute in app thread */
@ -31,7 +31,7 @@ Account* ChainDataModel::getAccount(qint64 id)
/** execute in main */ /** execute in main */
Q_EMIT queueExecute( [=](){ Q_EMIT queueExecute( [=](){
this->m_accounts.modify( insert_result.first, this->m_accounts.modify( insert_result.first,
[=]( Account* a ){ a->setProperty("name", name ); } [=]( Account* a ){ a->setProperty("accountName", name ); }
); );
}); });
} }
@ -56,27 +56,51 @@ Account* ChainDataModel::getAccount(qint64 id)
Account* ChainDataModel::getAccount(QString name) Account* ChainDataModel::getAccount(QString name)
{ {
auto itr = m_accounts.get<::by_name>().find(name); {
if( itr != m_accounts.get<::by_name>().end() ) auto itr = m_accounts.get<by_account_name>().begin();
while( itr != m_accounts.get<by_account_name>().end() )
{
edump(( (*itr)->getAccountName().toStdString()));
if((*itr)->name() == name.toStdString() )
wlog( "THEY ARE THE SAME" );
++itr;
}
}
auto& by_name_index = m_accounts.get<by_account_name>();
{
for( auto itr = by_name_index.begin(); itr != by_name_index.end(); ++itr )
wdump(( (*itr)->getAccountName().toStdString()));
}
auto itr = by_name_index.find(name.toStdString());
idump((itr != by_name_index.end()));
if( itr != by_name_index.end() )
{ {
return *itr; return *itr;
} }
auto acct = new Account(this); auto acct = new Account(this);
acct->setProperty("id", --m_account_query_num ); acct->setProperty("id", --m_account_query_num );
acct->setProperty("name", name); acct->setProperty("accountName", name);
auto insert_result = m_accounts.insert( acct ); auto insert_result = m_accounts.insert( acct );
edump( (insert_result.second) );
edump( (int64_t(*insert_result.first))(int64_t(acct)) );
auto itr2 = by_name_index.find(name.toStdString());
assert( itr2 != by_name_index.end() );
/** execute in app thread */ /** execute in app thread */
m_thread->async( [=](){ m_thread->async( [=](){
try { try {
ilog( "look up names.." );
auto result = m_db_api->lookup_account_names( {name.toStdString()} ); auto result = m_db_api->lookup_account_names( {name.toStdString()} );
idump((result));
if( result.size() && result.front().valid() ) if( result.size() && result.front().valid() )
{ {
/** execute in main */ /** execute in main */
Q_EMIT queueExecute( [=](){ Q_EMIT queueExecute( [=](){
this->m_accounts.modify( insert_result.first, this->m_accounts.modify( insert_result.first,
[=]( Account* a ){ [=]( Account* a ){
ilog( "setting id ${i}", ("i",result.front()->id.instance()) );
idump((int64_t(a)));
a->setProperty("id", result.front()->id.instance() ); a->setProperty("id", result.front()->id.instance() );
} }
); );
@ -87,7 +111,7 @@ Account* ChainDataModel::getAccount(QString name)
/** execute in main */ /** execute in main */
Q_EMIT queueExecute( [=](){ Q_EMIT queueExecute( [=](){
acct->deleteLater(); acct->deleteLater();
m_accounts.erase( insert_result.first ); this->m_accounts.erase( insert_result.first );
}); });
} }
} }
@ -98,6 +122,7 @@ Account* ChainDataModel::getAccount(QString name)
} }
}); });
idump((int64_t(acct)));
return acct; return acct;
} }
@ -142,17 +167,20 @@ void GrapheneApplication::start( QString apiurl, QString user, QString pass )
return; return;
} }
try { try {
auto con = m_client.connect( apiurl.toStdString() ); m_client = std::make_shared<fc::http::websocket_client>();
ilog( "connecting...${s}", ("s",apiurl.toStdString()) );
auto con = m_client->connect( apiurl.toStdString() );
auto apic = std::make_shared<fc::rpc::websocket_api_connection>(*con); auto apic = std::make_shared<fc::rpc::websocket_api_connection>(*con);
auto remote_api = apic->get_remote_api< login_api >(1); auto remote_api = apic->get_remote_api< login_api >(1);
auto db_api = apic->get_remote_api< database_api >(0); auto db_api = apic->get_remote_api< database_api >(0);
if( !remote_api->login( user.toStdString(), pass.toStdString() ) ) if( !remote_api->login( user.toStdString(), pass.toStdString() ) )
{ {
elog( "login failed" );
Q_EMIT loginFailed(); Q_EMIT loginFailed();
return; return;
} }
ilog( "connecting..." );
queueExecute( [=](){ queueExecute( [=](){
m_model->setDatabaseAPI( db_api ); m_model->setDatabaseAPI( db_api );
}); });

View file

@ -47,11 +47,11 @@ class Balance : public QObject {
class Account : public QObject { class Account : public QObject {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString name MEMBER name NOTIFY nameChanged) Q_PROPERTY(QString accountName MEMBER accountName NOTIFY accountNameChanged)
Q_PROPERTY(qint64 id MEMBER id NOTIFY idChanged) Q_PROPERTY(qint64 id MEMBER id NOTIFY idChanged)
Q_PROPERTY(QQmlListProperty<Balance> balances READ balances) Q_PROPERTY(QQmlListProperty<Balance> balances READ balances)
QString name; QString accountName;
qint64 id; qint64 id;
QList<Balance*> m_balances; QList<Balance*> m_balances;
@ -59,18 +59,19 @@ public:
Account(QObject* parent = nullptr) Account(QObject* parent = nullptr)
: QObject(parent){} : QObject(parent){}
const QString& getName()const { return name; } const QString& getAccountName()const { return accountName; }
qint64 getId()const { return id; } qint64 getId()const { return id; }
std::string name()const { return accountName.toStdString(); }
QQmlListProperty<Balance> balances(); QQmlListProperty<Balance> balances();
signals: signals:
void nameChanged(); void accountNameChanged();
void idChanged(); void idChanged();
}; };
struct by_id; struct by_id;
struct by_name; struct by_account_name;
/** /**
* @ingroup object_index * @ingroup object_index
*/ */
@ -78,7 +79,8 @@ typedef multi_index_container<
Account*, Account*,
indexed_by< indexed_by<
hashed_unique< tag<by_id>, const_mem_fun<Account, qint64, &Account::getId > >, hashed_unique< tag<by_id>, const_mem_fun<Account, qint64, &Account::getId > >,
ordered_non_unique< tag<by_name>, const_mem_fun<Account, const QString&, &Account::getName> > hashed_unique< tag<by_account_name>, const_mem_fun<Account, std::string, &Account::name> >
// ordered_non_unique< tag<by_account_name>, const_mem_fun<Account, std::string, &Account::name> >
> >
> account_multi_index_type; > account_multi_index_type;
@ -125,8 +127,8 @@ class GrapheneApplication : public QObject {
ChainDataModel* m_model = nullptr; ChainDataModel* m_model = nullptr;
bool m_isConnected = false; bool m_isConnected = false;
fc::http::websocket_client m_client; std::shared_ptr<fc::http::websocket_client> m_client;
fc::future<void> m_done; fc::future<void> m_done;
void setIsConnected( bool v ); void setIsConnected( bool v );

View file

@ -61,16 +61,23 @@ ApplicationWindow {
text: "Lookup" text: "Lookup"
onClicked: { onClicked: {
var acct = app.model.getAccount(nameField.text) var acct = app.model.getAccount(nameField.text)
console.log(JSON.stringify(acct))
// @disable-check M126 // @disable-check M126
if (acct == null) if (acct == null)
console.log("Got back null account") console.log("Got back null account")
else if (acct.id >= 0) else if (acct.id >= 0)
{
console.log("ID ALREADY SET" );
console.log(JSON.stringify(acct)) console.log(JSON.stringify(acct))
}
else else
{
console.log("Waiting for result...") console.log("Waiting for result...")
acct.idChanged.connect(function(loadedAcct) { acct.idChanged.connect(function(loadedAcct) {
console.log( "ID CHANGED" );
console.log(JSON.stringify(loadedAcct)) console.log(JSON.stringify(loadedAcct))
}) })
}
} }
} }
} }