1.1 --- a/core/Database.cpp Tue May 29 08:30:13 2007 +0000
1.2 +++ b/core/Database.cpp Tue May 29 08:32:12 2007 +0000
1.3 @@ -28,7 +28,22 @@
1.4
1.5 m_DriverType = g_HandleSys.CreateType("IDriver", this, 0, NULL, &sec, g_pCoreIdent, NULL);
1.6 m_DatabaseType = g_HandleSys.CreateType("IDatabase", this, 0, NULL, NULL, g_pCoreIdent, NULL);
1.7 - m_QueryType = g_HandleSys.CreateType("IQuery", this, 0, NULL, NULL, g_pCoreIdent, NULL);
1.8 +}
1.9 +
1.10 +void DBManager::OnSourceModShutdown()
1.11 +{
1.12 + g_HandleSys.RemoveType(m_DatabaseType, g_pCoreIdent);
1.13 + g_HandleSys.RemoveType(m_DriverType, g_pCoreIdent);
1.14 +}
1.15 +
1.16 +unsigned int DBManager::GetInterfaceVersion()
1.17 +{
1.18 + return SMINTERFACE_DBI_VERSION;
1.19 +}
1.20 +
1.21 +const char *DBManager::GetInterfaceName()
1.22 +{
1.23 + return SMINTERFACE_DBI_NAME;
1.24 }
1.25
1.26 void DBManager::OnHandleDestroy(HandleType_t type, void *object)
1.27 @@ -39,124 +54,24 @@
1.28 return;
1.29 }
1.30
1.31 - if (g_HandleSys.TypeCheck(type, m_QueryType))
1.32 + if (g_HandleSys.TypeCheck(type, m_DatabaseType))
1.33 {
1.34 - IQuery *pQuery = (IQuery *)object;
1.35 - pQuery->Release();
1.36 - } else if (g_HandleSys.TypeCheck(type, m_DatabaseType)) {
1.37 IDatabase *pdb = (IDatabase *)object;
1.38 pdb->Close();
1.39 }
1.40 }
1.41
1.42 -void DBManager::AddDriver(IDBDriver *pDriver, IdentityToken_t *ident)
1.43 -{
1.44 - if (!pDriver)
1.45 - {
1.46 - return;
1.47 - }
1.48 -
1.49 - if (m_drivers.size() >= HANDLESYS_MAX_SUBTYPES)
1.50 - {
1.51 - return;
1.52 - }
1.53 -
1.54 - db_driver *driver = new db_driver;
1.55 -
1.56 - driver->driver = pDriver;
1.57 - driver->ident = ident;
1.58 -
1.59 - HandleSecurity sec;
1.60 -
1.61 - sec.pIdentity = ident;
1.62 - sec.pOwner = g_pCoreIdent;
1.63 - driver->hDriver = g_HandleSys.CreateHandleEx(m_DriverType, driver, &sec, NULL, NULL);
1.64 -
1.65 - driver->htDatabase = g_HandleSys.CreateType(NULL, this, m_DatabaseType, NULL, NULL, g_pCoreIdent, NULL);
1.66 - driver->htQuery = g_HandleSys.CreateType(NULL, this, m_QueryType, NULL, NULL, g_pCoreIdent, NULL);
1.67 -
1.68 - m_drivers.push_back(driver);
1.69 -}
1.70 -
1.71 -void DBManager::RemoveDriver(IDBDriver *pDriver)
1.72 -{
1.73 - CVector<db_driver *>::iterator iter;
1.74 - for (iter = m_drivers.begin();
1.75 - iter != m_drivers.end();
1.76 - iter++)
1.77 - {
1.78 - if ((*iter)->driver == pDriver)
1.79 - {
1.80 - db_driver *driver = (*iter);
1.81 - HandleSecurity sec;
1.82 -
1.83 - sec.pIdentity = driver->ident;
1.84 - sec.pOwner = g_pCoreIdent;
1.85 - g_HandleSys.RemoveType(driver->htQuery, driver->ident);
1.86 - g_HandleSys.RemoveType(driver->htDatabase, driver->ident);
1.87 - g_HandleSys.FreeHandle(driver->hDriver, &sec);
1.88 -
1.89 - delete driver;
1.90 - m_drivers.erase(iter);
1.91 -
1.92 - return;
1.93 - }
1.94 - }
1.95 -}
1.96 -
1.97 -const char *DBManager::GetInterfaceName()
1.98 -{
1.99 - return SMINTERFACE_DBI_NAME;
1.100 -}
1.101 -
1.102 -unsigned int DBManager::GetInterfaceVersion()
1.103 -{
1.104 - return SMINTERFACE_DBI_VERSION;
1.105 -}
1.106 -
1.107 -unsigned int DBManager::GetDriverCount()
1.108 -{
1.109 - return (unsigned int)m_drivers.size();
1.110 -}
1.111 -
1.112 -IDBDriver *DBManager::GetDriver(unsigned int index, IdentityToken_t **pToken)
1.113 -{
1.114 - if (index >= GetDriverCount())
1.115 - {
1.116 - return NULL;
1.117 - }
1.118 -
1.119 - if (pToken)
1.120 - {
1.121 - *pToken = m_drivers[index]->ident;
1.122 - }
1.123 -
1.124 - return m_drivers[index]->driver;
1.125 -}
1.126 -
1.127 -const DatabaseInfo *DBManager::FindDatabaseConf(const char *name)
1.128 -{
1.129 - /* :TODO: implement */
1.130 - return NULL;
1.131 -}
1.132 -
1.133 -bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent)
1.134 +bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool persistent, char *error, size_t maxlength)
1.135 {
1.136 const DatabaseInfo *pInfo = FindDatabaseConf(name);
1.137
1.138 - unsigned int count = GetDriverCount();
1.139 - for (unsigned int i=0; i<count; i++)
1.140 + for (size_t i=0; i<m_drivers.size(); i++)
1.141 {
1.142 - IDBDriver *driver = GetDriver(i);
1.143 - if (strcmp(driver->GetIdentifier(), pInfo->driver) == 0)
1.144 + if (strcasecmp(pInfo->driver, m_drivers[i]->GetIdentifier()) == 0)
1.145 {
1.146 - *pdr = driver;
1.147 - if (persistent)
1.148 - {
1.149 - *pdb = driver->PConnect(pInfo);
1.150 - } else {
1.151 - *pdb = driver->Connect(pInfo);
1.152 - }
1.153 + *pdr = m_drivers[i];
1.154 + *pdb = m_drivers[i]->Connect(pInfo, persistent, error, maxlength);
1.155 + return (*pdb == NULL);
1.156 }
1.157 }
1.158
1.159 @@ -165,3 +80,81 @@
1.160
1.161 return false;
1.162 }
1.163 +
1.164 +void DBManager::AddDriver(IDBDriver *pDriver)
1.165 +{
1.166 + m_drivers.push_back(pDriver);
1.167 +}
1.168 +
1.169 +void DBManager::RemoveDriver(IDBDriver *pDriver)
1.170 +{
1.171 + for (size_t i=0; i<m_drivers.size(); i++)
1.172 + {
1.173 + if (m_drivers[i] == pDriver)
1.174 + {
1.175 + m_drivers.erase(m_drivers.iterAt(i));
1.176 + return;
1.177 + }
1.178 + }
1.179 +}
1.180 +
1.181 +Handle_t DBManager::CreateHandle(DBHandleType dtype, void *ptr, IdentityToken_t *pToken)
1.182 +{
1.183 + HandleType_t type = 0;
1.184 +
1.185 + if (dtype == DBHandle_Driver)
1.186 + {
1.187 + type = m_DriverType;
1.188 + } else if (dtype == DBHandle_Database) {
1.189 + type = m_DatabaseType;
1.190 + } else {
1.191 + return BAD_HANDLE;
1.192 + }
1.193 +
1.194 + return g_HandleSys.CreateHandle(type, ptr, pToken, g_pCoreIdent, NULL);
1.195 +}
1.196 +
1.197 +HandleError DBManager::ReadHandle(Handle_t hndl, DBHandleType dtype, void **ptr)
1.198 +{
1.199 + HandleType_t type = 0;
1.200 +
1.201 + if (dtype == DBHandle_Driver)
1.202 + {
1.203 + type = m_DriverType;
1.204 + } else if (dtype == DBHandle_Database) {
1.205 + type = m_DatabaseType;
1.206 + } else {
1.207 + return HandleError_Type;
1.208 + }
1.209 +
1.210 + HandleSecurity sec(NULL, g_pCoreIdent);
1.211 +
1.212 + return g_HandleSys.ReadHandle(hndl, dtype, &sec, ptr);
1.213 +}
1.214 +
1.215 +HandleError DBManager::ReleaseHandle(Handle_t hndl, DBHandleType type, IdentityToken_t *token)
1.216 +{
1.217 + HandleSecurity sec(token, g_pCoreIdent);
1.218 + return g_HandleSys.FreeHandle(hndl, &sec);
1.219 +}
1.220 +
1.221 +unsigned int DBManager::GetDriverCount()
1.222 +{
1.223 + return (unsigned int)m_drivers.size();
1.224 +}
1.225 +
1.226 +IDBDriver *DBManager::GetDriver(unsigned int index)
1.227 +{
1.228 + if (index >= m_drivers.size())
1.229 + {
1.230 + return NULL;
1.231 + }
1.232 +
1.233 + return m_drivers[index];
1.234 +}
1.235 +
1.236 +const DatabaseInfo *DBManager::FindDatabaseConf(const char *name)
1.237 +{
1.238 + /* :TODO: */
1.239 + return NULL;
1.240 +}