Skip to content

Commit 296e661

Browse files
committed
createBaseFromDBID等接口需要完善。 按照API手册来实现。
1 parent 3b8a224 commit 296e661

File tree

3 files changed

+105
-11
lines changed

3 files changed

+105
-11
lines changed

kbe/src/server/baseapp/baseapp.cpp

Lines changed: 70 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -995,6 +995,8 @@ void Baseapp::onCreateBaseFromDBIDCallback(Network::Channel* pChannel, KBEngine:
995995
bool success = false;
996996
bool wasActive = false;
997997
ENTITY_ID entityID;
998+
COMPONENT_ID wasActiveCID;
999+
ENTITY_ID wasActiveEntityID;
9981000

9991001
s >> entityType;
10001002
s >> dbid;
@@ -1003,23 +1005,49 @@ void Baseapp::onCreateBaseFromDBIDCallback(Network::Channel* pChannel, KBEngine:
10031005
s >> entityID;
10041006
s >> wasActive;
10051007

1006-
if(!success)
1008+
if(wasActive)
10071009
{
1008-
ERROR_MSG(fmt::format("Baseapp::onCreateBaseFromDBID: create {}({}) is failed.\n",
1009-
entityType.c_str(), dbid));
1010+
s >> wasActiveCID;
1011+
s >> wasActiveEntityID;
1012+
}
10101013

1014+
if(!success)
1015+
{
10111016
if(callbackID > 0)
10121017
{
10131018
SCOPED_PROFILE(SCRIPTCALL_PROFILE);
10141019

1015-
Py_INCREF(Py_None);
1020+
PyObject* baseRef = NULL;
1021+
1022+
if(wasActive && wasActiveCID > 0 && wasActiveEntityID > 0)
1023+
{
1024+
Base* pBase = this->findEntity(wasActiveEntityID);
1025+
if(pBase)
1026+
{
1027+
baseRef = static_cast<PyObject*>(pBase);
1028+
Py_INCREF(baseRef);
1029+
}
1030+
else
1031+
{
1032+
baseRef = static_cast<PyObject*>(new EntityMailbox(EntityDef::findScriptModule(entityType.c_str()), NULL, wasActiveCID, wasActiveEntityID, MAILBOX_TYPE_BASE));
1033+
}
1034+
}
1035+
else
1036+
{
1037+
baseRef = Py_None;
1038+
Py_INCREF(baseRef);
1039+
1040+
ERROR_MSG(fmt::format("Baseapp::onCreateBaseFromDBID: create {}({}) is failed.\n",
1041+
entityType.c_str(), dbid));
1042+
}
1043+
10161044
// baseRef, dbid, wasActive
10171045
PyObjectPtr pyfunc = pyCallbackMgr_.take(callbackID);
10181046
if(pyfunc != NULL)
10191047
{
10201048
PyObject* pyResult = PyObject_CallFunction(pyfunc.get(),
10211049
const_cast<char*>("OKi"),
1022-
Py_None, dbid, wasActive);
1050+
baseRef, dbid, wasActive);
10231051

10241052
if(pyResult != NULL)
10251053
Py_DECREF(pyResult);
@@ -1031,6 +1059,8 @@ void Baseapp::onCreateBaseFromDBIDCallback(Network::Channel* pChannel, KBEngine:
10311059
ERROR_MSG(fmt::format("Baseapp::onCreateBaseFromDBID: can't found callback:{}.\n",
10321060
callbackID));
10331061
}
1062+
1063+
Py_DECREF(baseRef);
10341064
}
10351065

10361066
s.opfini();
@@ -1207,6 +1237,8 @@ void Baseapp::onCreateBaseAnywhereFromDBIDCallback(Network::Channel* pChannel, K
12071237
bool success = false;
12081238
bool wasActive = false;
12091239
ENTITY_ID entityID;
1240+
COMPONENT_ID wasActiveCID;
1241+
ENTITY_ID wasActiveEntityID;
12101242

12111243
s >> entityType;
12121244
s >> dbid;
@@ -1215,23 +1247,49 @@ void Baseapp::onCreateBaseAnywhereFromDBIDCallback(Network::Channel* pChannel, K
12151247
s >> entityID;
12161248
s >> wasActive;
12171249

1218-
if(!success)
1250+
if(wasActive)
12191251
{
1220-
ERROR_MSG(fmt::format("Baseapp::createBaseAnywhereFromDBID: create {}({}) is failed.\n",
1221-
entityType.c_str(), dbid));
1252+
s >> wasActiveCID;
1253+
s >> wasActiveEntityID;
1254+
}
12221255

1256+
if(!success)
1257+
{
12231258
if(callbackID > 0)
12241259
{
12251260
SCOPED_PROFILE(SCRIPTCALL_PROFILE);
12261261

1227-
Py_INCREF(Py_None);
1262+
PyObject* baseRef = NULL;
1263+
1264+
if(wasActive && wasActiveCID > 0 && wasActiveEntityID > 0)
1265+
{
1266+
Base* pBase = this->findEntity(wasActiveEntityID);
1267+
if(pBase)
1268+
{
1269+
baseRef = static_cast<PyObject*>(pBase);
1270+
Py_INCREF(baseRef);
1271+
}
1272+
else
1273+
{
1274+
baseRef = static_cast<PyObject*>(new EntityMailbox(EntityDef::findScriptModule(entityType.c_str()), NULL, wasActiveCID, wasActiveEntityID, MAILBOX_TYPE_BASE));
1275+
}
1276+
}
1277+
else
1278+
{
1279+
ERROR_MSG(fmt::format("Baseapp::createBaseAnywhereFromDBID: create {}({}) is failed.\n",
1280+
entityType.c_str(), dbid));
1281+
1282+
baseRef = Py_None;
1283+
Py_INCREF(baseRef);
1284+
}
1285+
12281286
// baseRef, dbid, wasActive
12291287
PyObjectPtr pyfunc = pyCallbackMgr_.take(callbackID);
12301288
if(pyfunc != NULL)
12311289
{
12321290
PyObject* pyResult = PyObject_CallFunction(pyfunc.get(),
12331291
const_cast<char*>("OKi"),
1234-
Py_None, dbid, wasActive);
1292+
baseRef, dbid, wasActive);
12351293

12361294
if(pyResult != NULL)
12371295
Py_DECREF(pyResult);
@@ -1243,6 +1301,8 @@ void Baseapp::onCreateBaseAnywhereFromDBIDCallback(Network::Channel* pChannel, K
12431301
ERROR_MSG(fmt::format("Baseapp::createBaseAnywhereFromDBID: can't found callback:{}.\n",
12441302
callbackID));
12451303
}
1304+
1305+
Py_DECREF(baseRef);
12461306
}
12471307

12481308
s.opfini();

kbe/src/server/dbmgr/dbtasks.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1579,7 +1579,9 @@ callbackID_(callbackID),
15791579
success_(false),
15801580
s_(),
15811581
entityID_(entityID),
1582-
wasActive_(false)
1582+
wasActive_(false),
1583+
wasActiveCID_(0),
1584+
wasActiveEntityID_(0)
15831585
{
15841586
}
15851587

@@ -1619,7 +1621,29 @@ bool DBTaskQueryEntity::db_thread_process()
16191621
}
16201622

16211623
if(!success_)
1624+
{
1625+
KBEEntityLogTable::EntityLog entitylog;
1626+
1627+
try
1628+
{
1629+
pELTable->queryEntity(pdbi_, dbid_, entitylog, pModule->getUType());
1630+
}
1631+
catch (std::exception & e)
1632+
{
1633+
DBException& dbe = static_cast<DBException&>(e);
1634+
if(dbe.isLostConnection())
1635+
{
1636+
static_cast<DBInterfaceMysql*>(pdbi_)->processException(e);
1637+
return true;
1638+
}
1639+
else
1640+
success_ = false;
1641+
}
1642+
1643+
wasActiveCID_ = entitylog.componentID;
1644+
wasActiveEntityID_ = entitylog.entityID;
16221645
wasActive_ = true;
1646+
}
16231647
}
16241648

16251649
return false;
@@ -1645,6 +1669,12 @@ thread::TPTask::TPTaskState DBTaskQueryEntity::presentMainThread()
16451669
(*pBundle) << entityID_;
16461670
(*pBundle) << wasActive_;
16471671

1672+
if(wasActive_)
1673+
{
1674+
(*pBundle) << wasActiveCID_;
1675+
(*pBundle) << wasActiveEntityID_;
1676+
}
1677+
16481678
if(success_)
16491679
{
16501680
pBundle->append(s_);

kbe/src/server/dbmgr/dbtasks.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,11 @@ class DBTaskQueryEntity : public EntityDBTask
481481
bool success_;
482482
MemoryStream s_;
483483
ENTITY_ID entityID_;
484+
485+
// 如果实体已经激活,则这个属性指向实体所在app
484486
bool wasActive_;
487+
COMPONENT_ID wasActiveCID_;
488+
ENTITY_ID wasActiveEntityID_;
485489
};
486490

487491
}

0 commit comments

Comments
 (0)