//this is a crap load of work... there HAS to be a better way to do this.. PyRep *MarketDB::GetMarketGroups() { DBQueryResult res; DBResultRow row; if(!sDatabase.RunQuery(res, "SELECT * " " FROM invMarketGroups")) { codelog(MARKET__ERROR, "Error in query: %s", res.error.c_str()); return NULL; } DBRowDescriptor *header = new DBRowDescriptor(res); CFilterRowSet *filterRowset = new CFilterRowSet(&header); PyDict *keywords = filterRowset->GetKeywords(); keywords->SetItemString("giveMeSets", new PyBool(false)); //+ keywords->SetItemString("allowDuplicateCompoundKeys", new PyBool(false)); //+ keywords->SetItemString("indexName", new PyNone); //+ keywords->SetItemString("columnName", new PyString("parentGroupID")); //+ std::map< int, PyRep* > tt; while( res.GetRow(row) ) { int parentGroupID = ( row.IsNull( 0 ) ? -1 : row.GetUInt( 0 ) ); PyRep *pid; CRowSet *rowset; if(tt.count(parentGroupID) == 0) { pid = parentGroupID!=-1 ? (PyRep*)new PyInt(parentGroupID) : (PyRep*)new PyNone(); tt.insert( std::pair<int, PyRep*>(parentGroupID, pid) ); rowset = filterRowset->NewRowset(pid); } else { pid = tt[parentGroupID]; rowset = filterRowset->GetRowset(pid); } PyPackedRow* pyrow = rowset->NewRow(); pyrow->SetField((uint32)0, pid); //prentGroupID pyrow->SetField(1, new PyInt(row.GetUInt( 1 ) ) ); //marketGroupID pyrow->SetField(2, new PyString(row.GetText( 2 ) ) ); //marketGroupName pyrow->SetField(3, new PyString(row.GetText( 3 ) ) ); //description pyrow->SetField(4, row.IsNull( 4 ) ? (PyRep*)(new PyNone()) : new PyInt(row.GetUInt( 4 )) ); //graphicID pyrow->SetField(5, new PyBool(row.GetBool( 5 ) ) ); //hasTypes pyrow->SetField(6, row.IsNull( 6 ) ? (PyRep*)(new PyNone()) : new PyInt(row.GetUInt( 6 )) ); // iconID pyrow->SetField(7, new PyInt( row.GetUInt(7) ) ); //dataID pyrow->SetField(8, new PyInt( row.GetUInt(8) ) ); //marketGroupNameID pyrow->SetField(9, new PyInt( row.GetUInt(9) ) ); //descriptionID } return filterRowset; }
void TestMarshal( const Seperator& cmd ) { const char* cmdName = cmd.arg( 0 ).c_str(); DBRowDescriptor *header = new DBRowDescriptor; // Fill header: header->AddColumn( "historyDate", DBTYPE_FILETIME ); header->AddColumn( "lowPrice", DBTYPE_CY ); header->AddColumn( "highPrice", DBTYPE_CY ); header->AddColumn( "avgPrice", DBTYPE_CY ); header->AddColumn( "volume", DBTYPE_I8 ); header->AddColumn( "orders", DBTYPE_I4 ); CRowSet* rs = new CRowSet( &header ); PyPackedRow* row = rs->NewRow(); row->SetField( "historyDate", new PyLong( Win32TimeNow() ) ); row->SetField( "lowPrice", new PyLong( 18000 ) ); row->SetField( "highPrice", new PyLong( 19000 ) ); row->SetField( "avgPrice", new PyLong( 18400 ) ); row->SetField( "volume", new PyLong( 5463586 ) ); row->SetField( "orders", new PyInt( 254 ) ); sLog.Log( cmdName, "Marshaling..." ); Buffer marshaled; bool res = MarshalDeflate( rs, marshaled ); PyDecRef( rs ); if( !res ) { sLog.Error( cmdName, "Failed to marshal Python object." ); return; } sLog.Log( cmdName, "Unmarshaling..." ); PyRep* rep = InflateUnmarshal( marshaled ); if( NULL == rep ) { sLog.Error( cmdName, "Failed to unmarshal Python object." ); return; } sLog.Success( cmdName, "Final:" ); rep->Dump( stdout, " " ); PyDecRef( rep ); }
PyResult ContractMgrService::Handle_GetContractList( PyCallArgs& call ) { sLog.Debug( "ContractMgrService", "Called GetContractListForOwner stub." ); // Call_GetContractListForOwner arg; PyDict* _contract = new PyDict; /*if( !arg.Decode(&call.tuple) ) { codelog(SERVICE__ERROR, "%s: Bad arguments to GetContractListForOwner", call.client->GetName()); return NULL; }*/ // Manual creation of a CRowset, i hate doing this -.-" DBRowDescriptor *header = new DBRowDescriptor(); header->AddColumn( "contractID", DBTYPE_I4); header->AddColumn( "issuerID", DBTYPE_I4); header->AddColumn( "issuerCorpID", DBTYPE_I4 ); header->AddColumn( "type", DBTYPE_UI1 ); header->AddColumn( "availability", DBTYPE_I4 ); header->AddColumn( "assigneeID", DBTYPE_I4 ); header->AddColumn( "numDays", DBTYPE_I4 ); header->AddColumn( "startStationID", DBTYPE_I4 ); header->AddColumn( "endStationID", DBTYPE_I4 ); header->AddColumn( "startSolarSystemID", DBTYPE_I4 ); header->AddColumn( "endSolarSystemID", DBTYPE_I4 ); header->AddColumn( "startRegionID", DBTYPE_I4 ); header->AddColumn( "endRegionID", DBTYPE_I4 ); header->AddColumn( "price", DBTYPE_CY ); header->AddColumn( "reward", DBTYPE_CY ); header->AddColumn( "collateral", DBTYPE_CY ); header->AddColumn( "title", DBTYPE_WSTR ); header->AddColumn( "description", DBTYPE_WSTR ); header->AddColumn( "forCorp", DBTYPE_BOOL ); header->AddColumn( "status", DBTYPE_UI1 ); header->AddColumn( "acceptorID", DBTYPE_I4 ); header->AddColumn( "dateIssued", DBTYPE_FILETIME ); header->AddColumn( "dateExpired", DBTYPE_FILETIME ); header->AddColumn( "dateAccepted", DBTYPE_FILETIME ); header->AddColumn( "dateCompleted", DBTYPE_FILETIME ); header->AddColumn( "volume", DBTYPE_R8 ); header->AddColumn( "issuerAllianceID", DBTYPE_I4 ); header->AddColumn( "issuerWalletKey", DBTYPE_I4 ); CRowSet *rowset = new CRowSet( &header ); PyList* fieldData = new PyList; DBResultRow row; std::map<uint32, ContractRef>::const_iterator cur, end; std::map<uint32, ContractRef> contracts = m_contractManager->GetContractList(); cur = contracts.begin(); end = contracts.end(); util_Rowset res; for(; cur != end; cur++ ) { ContractRef contract = cur->second; PyPackedRow* into = rowset->NewRow(); fieldData->AddItemInt( contract->contractID() ); fieldData->AddItemInt( contract->issuerID() ); fieldData->AddItemInt( contract->issuerCorpID() ); fieldData->AddItemInt( contract->type() ); fieldData->AddItemInt( contract->avail() ); fieldData->AddItemInt( contract->assigneeID() ); fieldData->AddItemInt( contract->expiretime() ); fieldData->AddItemInt( contract->duration() ); fieldData->AddItemInt( contract->startStationID() ); fieldData->AddItemInt( contract->endStationID() ); fieldData->AddItemInt( contract->startSolarSystemID() ); fieldData->AddItemInt( contract->endSolarSystemID() ); fieldData->AddItemInt( contract->startRegionID() ); fieldData->AddItemInt( contract->endRegionID() ); fieldData->AddItemInt( contract->price() ); fieldData->AddItemInt( contract->reward() ); fieldData->AddItemInt( contract->collateral() ); fieldData->AddItemString( contract->title().c_str() ); fieldData->AddItemString( contract->description().c_str() ); fieldData->AddItemInt( contract->forCorp() ); fieldData->AddItemInt( contract->status() ); fieldData->AddItemInt( contract->isAccepted() ); fieldData->AddItemInt( contract->acceptorID() ); fieldData->AddItemInt( contract->dateIssued() ); fieldData->AddItemInt( contract->dateExpired() ); fieldData->AddItemInt( contract->dateAccepted() ); fieldData->AddItemInt( contract->dateCompleted() ); fieldData->AddItemInt( contract->volume() ); into->SetField( contract->contractID(), fieldData ); fieldData = new PyList; res.lines = new PyList; res.header.clear(); fieldData = new PyList; res.header.push_back( "itemTypeID" ); res.header.push_back( "quantity" ); res.header.push_back( "inCrate" ); std::map<uint32, ContractRequestItemRef>::const_iterator rCur, rEnd; for(; rCur != rEnd; rCur++ ) { fieldData->AddItemInt( rCur->second->m_typeID ); fieldData->AddItemInt( rCur->second->m_quantity ); fieldData->AddItemInt( false ); res.lines->AddItem( fieldData ); fieldData = new PyList; } std::map<uint32, ContractGetItemsRef>::const_iterator iCur, iEnd; for(; iCur != iEnd; iCur++ ) { fieldData->AddItemInt( iCur->second->m_itemID ); fieldData->AddItemInt( iCur->second->m_quantity ); fieldData->AddItemInt( true ); res.lines->AddItem( fieldData ); fieldData = new PyList; } } _contract->SetItemString( "contracts", rowset ); _contract->SetItemString( "items", res.Encode() ); _contract->SetItemString( "bids", new PyNone ); return new PyObject( new PyString( "util.KeyVal" ), _contract ); }
PyResult ContractMgrService::Handle_GetContract( PyCallArgs& call ) { Call_SingleIntegerArg arg; PyDict* _contract = new PyDict; if( !arg.Decode( &call.tuple ) ) { codelog(SERVICE__ERROR, "%s: Bad arguments to GetContract in contractMgr", call.client->GetCharacterName() ); return NULL; } // Manual creation of PyPackedRow DBRowDescriptor *header = new DBRowDescriptor(); header->AddColumn( "contractID", DBTYPE_I4 ); header->AddColumn( "issuerID", DBTYPE_I4 ); header->AddColumn( "issuerCorpID", DBTYPE_I4 ); header->AddColumn( "type", DBTYPE_UI1 ); header->AddColumn( "availability", DBTYPE_I4 ); header->AddColumn( "assigneeID", DBTYPE_I4 ); header->AddColumn( "numDays", DBTYPE_I4 ); header->AddColumn( "startStationID", DBTYPE_I4 ); header->AddColumn( "endStationID", DBTYPE_I4 ); header->AddColumn( "startSolarSystemID", DBTYPE_I4 ); header->AddColumn( "endSolarSystemID", DBTYPE_I4 ); header->AddColumn( "startRegionID", DBTYPE_I4 ); header->AddColumn( "endRegionID", DBTYPE_I4 ); header->AddColumn( "price", DBTYPE_CY ); header->AddColumn( "reward", DBTYPE_CY ); header->AddColumn( "collateral", DBTYPE_CY ); header->AddColumn( "title", DBTYPE_WSTR ); header->AddColumn( "description", DBTYPE_WSTR ); header->AddColumn( "forCorp", DBTYPE_BOOL ); header->AddColumn( "status", DBTYPE_UI1 ); header->AddColumn( "acceptorID", DBTYPE_I4 ); header->AddColumn( "dateIssued", DBTYPE_FILETIME ); header->AddColumn( "dateExpired", DBTYPE_FILETIME ); header->AddColumn( "dateAccepted", DBTYPE_FILETIME ); header->AddColumn( "dateCompleted", DBTYPE_FILETIME ); header->AddColumn( "volume", DBTYPE_R8 ); header->AddColumn( "issuerAllianceID", DBTYPE_I4 ); header->AddColumn( "issuerWalletKey", DBTYPE_I4 ); header->AddColumn( "acceptorWalletKey", DBTYPE_I4 ); header->AddColumn( "crateID", DBTYPE_I4 ); ContractRef contract = m_contractManager->GetContract( arg.arg ); uint32 n = 0; PyPackedRow* into = new PyPackedRow( header ); into->SetField( "contractID", new PyInt( contract->contractID() ) ); into->SetField( "issuerID", new PyInt( contract->issuerID() ) ); into->SetField( "issuerCorpID", new PyInt( contract->issuerCorpID() ) ); into->SetField( "type", new PyInt( contract->type() ) ); into->SetField( "availability", new PyInt( contract->avail() ) ); into->SetField( "assigneeID", new PyInt( contract->assigneeID() ) ); into->SetField( "numDays", new PyInt( 0 ) ); into->SetField( "startStationID", new PyInt( contract->startStationID() ) ); into->SetField( "endStationID", new PyInt( contract->endStationID() ) ); into->SetField( "startSolarSystemID", new PyInt( contract->startSolarSystemID() ) ); into->SetField( "endSolarSystemID", new PyInt( contract->endSolarSystemID() ) ); into->SetField( "startRegionID", new PyInt( contract->startRegionID() ) ); into->SetField( "endRegionID", new PyInt( contract->endRegionID() ) ); into->SetField( "price", new PyFloat( contract->price() ) ); into->SetField( "reward", new PyFloat( contract->reward() ) ); into->SetField( "collateral", new PyFloat( contract->collateral() ) ); into->SetField( "title", new PyString( "title" ) ); into->SetField( "description", new PyString( "description" ) ); into->SetField( "forCorp", new PyBool( contract->forCorp() ) ); into->SetField( "status", new PyInt( contract->status() ) ); into->SetField( "acceptorID", new PyInt( contract->acceptorID() ) ); into->SetField( "dateIssued", new PyLong( contract->dateIssued() ) ); into->SetField( "dateExpired", new PyLong( contract->dateExpired() ) ); into->SetField( "dateAccepted", new PyLong( contract->dateAccepted() ) ); into->SetField( "dateCompleted", new PyLong( contract->dateCompleted() ) ); into->SetField( "volume", new PyFloat( contract->volume() ) ); into->SetField( "issuerAllianceID", new PyInt( contract->issuerAllianceID() ) ); into->SetField( "issuerWalletKey", new PyInt( contract->issuerWalletKey() ) ); into->SetField( "acceptorWalletKey", new PyInt( 0 ) ); into->SetField( "crateID", new PyInt( 0 ) ); PyList* itemList = new PyList; DBRowDescriptor *itemHeader = new DBRowDescriptor(); itemHeader->AddColumn( "contractID", DBTYPE_I4 ); itemHeader->AddColumn( "itemID", DBTYPE_I4 ); itemHeader->AddColumn( "quantity", DBTYPE_I4 ); itemHeader->AddColumn( "itemTypeID", DBTYPE_I4 ); itemHeader->AddColumn( "inCrate", DBTYPE_BOOL ); itemHeader->AddColumn( "parentID", DBTYPE_I4 ); itemHeader->AddColumn( "productivityLevel", DBTYPE_I4 ); itemHeader->AddColumn( "materialLevel", DBTYPE_I4 ); itemHeader->AddColumn( "copy", DBTYPE_I4 ); itemHeader->AddColumn( "licensedProductionRunsRemaining", DBTYPE_I4 ); itemHeader->AddColumn( "damage", DBTYPE_R8 ); itemHeader->AddColumn( "flagID", DBTYPE_I2 ); std::map<uint32, ContractGetItemsRef>::const_iterator cur, end; std::map<uint32, ContractGetItemsRef> items = contract->items(); cur = items.begin(); end = items.end(); for(; cur != end; cur++ ) { PyPackedRow* data = new PyPackedRow( itemHeader ); InventoryItemRef item = m_manager->item_factory.GetItem( cur->second->m_itemID ); data->SetField( "contractID", new PyInt( contract->contractID() ) ); data->SetField( "itemID", new PyInt( item->itemID() ) ); data->SetField( "quantity", new PyInt( cur->second->m_quantity ) ); data->SetField( "itemTypeID", new PyInt( item->typeID() ) ); data->SetField( "inCrate", new PyBool( true ) ); if( item->categoryID() == EVEDB::invCategories::Blueprint ) { BlueprintRef bp = m_manager->item_factory.GetBlueprint( item->itemID() ); data->SetField( "parentID", new PyInt( bp->parentBlueprintTypeID() ) ); data->SetField( "productivityLevel", new PyInt( bp->productivityLevel() ) ); data->SetField( "materialLevel", new PyInt( bp->materialLevel() ) ); data->SetField( "copy", new PyInt( bp->copy() ) ); data->SetField( "licensedProductionRunsRemaining", new PyInt( bp->licensedProductionRunsRemaining() ) ); if( bp->HasAttribute( 3 ) ) data->SetField( "damage", new PyFloat( bp->GetAttribute( 3 ).get_float() ) ); else data->SetField( "damage", new PyFloat( 0.0 ) ); data->SetField( "flagID", new PyInt( bp->flag() ) ); } else { data->SetField( "parentID", new PyInt( 0 ) ); data->SetField( "productivityLevel", new PyInt( 0 ) ); data->SetField( "materialLevel", new PyInt( 0 ) ); data->SetField( "copy", new PyInt( 0 ) ); data->SetField( "licensedProductionRunsRemaining", new PyInt( 0 ) ); if( item->HasAttribute( 3 ) ) data->SetField( "damage", new PyFloat( item->GetAttribute( 3 ).get_float() ) ); else data->SetField( "damage", new PyFloat( 0.0 ) ); data->SetField( "flagID", new PyInt( item->flag() ) ); } itemList->AddItem( data ); } std::map<uint32, ContractRequestItemRef>::const_iterator c, e; std::map<uint32, ContractRequestItemRef> requestItems = contract->requestItems(); c = requestItems.begin(); e = requestItems.end(); for(; c != e; c++ ) { PyPackedRow* data = new PyPackedRow( itemHeader ); data->SetField( "contractID", new PyInt( arg.arg ) ); data->SetField( "itemID", new PyInt( 0 ) ); data->SetField( "quantity", new PyInt( c->second->m_quantity ) ); data->SetField( "itemTypeID", new PyInt( c->second->m_typeID ) ); data->SetField( "inCrate", new PyBool( false ) ); data->SetField( "parentID", new PyInt( 0 ) ); data->SetField( "productivityLevel", new PyInt( 0 ) ); data->SetField( "materialLevel", new PyInt( 0 ) ); data->SetField( "copy", new PyInt( 0 ) ); data->SetField( "licensedProductionRunsRemaining", new PyInt( 0 ) ); data->SetField( "damage", new PyFloat( 0.0 ) ); data->SetField( "flagID", new PyInt( 0 ) ); itemList->AddItem( data ); } DBRowDescriptor *bidsHeader = new DBRowDescriptor(); bidsHeader->AddColumn( "bidID", DBTYPE_I4 ); bidsHeader->AddColumn( "contractID", DBTYPE_I4 ); bidsHeader->AddColumn( "issuerID", DBTYPE_I4 ); bidsHeader->AddColumn( "quantity", DBTYPE_I4 ); bidsHeader->AddColumn( "issuerCorpID", DBTYPE_I4 ); bidsHeader->AddColumn( "issuerStationID", DBTYPE_I4 ); bidsHeader->AddColumn( "issuerSolarSystemID", DBTYPE_I4 ); bidsHeader->AddColumn( "issuerRegionID", DBTYPE_I4 ); CRowSet *bids_rowset = new CRowSet( &bidsHeader ); _contract->SetItemString( "items", itemList ); _contract->SetItemString( "bids", bids_rowset ); _contract->SetItemString( "contract", into); PyObject* res = new PyObject( new PyString( "util.KeyVal" ), _contract ); return res; }