DBServer.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. #include "stdafx.h"
  2. #include "DBServer.h"
  3. #include "DBServerDlg.h"
  4. #include "theDBServer.h"
  5. #include "MyLock.h"
  6. #include "mysqldata.h"
  7. #include "DumpCollect.h"
  8. #include "GAT.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. BEGIN_MESSAGE_MAP(CDBServer, CWinApp)
  15. //{{AFX_MSG_MAP(CDBServer)
  16. ON_COMMAND(ID_APP_SHOW, OnAppShow)
  17. ON_COMMAND(ID_APP_EXIT, OnAppExit)
  18. ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
  19. ON_COMMAND(ID_HELP_INDEX, OnHelpIndex)
  20. //}}AFX_MSG_MAP
  21. ON_COMMAND(ID_HELP, CWinApp::OnHelp)
  22. END_MESSAGE_MAP()
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CDBServer construction
  25. CDBServer::CDBServer()
  26. {
  27. // TODO: add construction code here,
  28. // Place all significant initialization in InitInstance
  29. }
  30. /////////////////////////////////////////////////////////////////////////////
  31. // The one and only CDBServer object
  32. CDBServer theApp;
  33. CtheDBServer theServer;
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CDBServer initialization
  36. BOOL CDBServer::InitInstance()
  37. {
  38. AfxInitRichEdit2();
  39. CWinApp::InitInstance();
  40. AfxEnableControlContainer();
  41. DumpCollect::InitMinDump();
  42. InitSocketLibrary(MAKEWORD(2,2));
  43. GuardAgainstTheft guard;
  44. guard.FindYtUSB();
  45. // 2.配置数据库连接信息;
  46. char server[50];
  47. DWORD leng=50;
  48. memset(server, 0, 50);
  49. ::GetComputerName(server, &leng);
  50. _stprintf_s(g_szHostName, MAX_PATH, _T("%s"), server);
  51. g_localname = server;
  52. TCHAR szDir[MAX_PATH];
  53. ::GetModuleFileName(NULL, szDir, MAX_PATH);
  54. g_mainpath = szDir;
  55. g_mainpath = g_mainpath.Left (g_mainpath.ReverseFind ('\\'));
  56. if( GetIniInfo() == -1)
  57. {
  58. WriteTextLog("未找到配置文件:ServiceInfo.ini");
  59. return FALSE;
  60. }
  61. // 服务器延时启动;
  62. if ( g_dwStartDelayTime )
  63. {
  64. Sleep(g_dwStartDelayTime*1000);
  65. }
  66. // 1.根据运行的端口号来运行单实例;
  67. _stprintf_s(szDir, _T("lyfzServer%d"), g_dwCSPort);
  68. HANDLE hObject = CreateMutex(NULL, FALSE, szDir);
  69. if(GetLastError() == ERROR_ALREADY_EXISTS)
  70. {
  71. return false;
  72. }
  73. g_strdbpsw.Format("uid=%s;pwd=%s",g_szDBAccount,g_szDBPassWord);
  74. if ( g_dwDBServerPort != 0 )
  75. g_strdbServrename.Format("%s,%d",g_szDBSource,g_dwDBServerPort);
  76. else
  77. g_strdbServrename.Format("%s",g_szDBSource);
  78. WriteTextLog("启动");
  79. // 3.初始化加密狗信息,并获取相应的加密数据;
  80. MyLock lock("ytSoftKeyaccessxiao");
  81. if(ytSoftKey.IniEx())
  82. {
  83. AfxMessageBox(_T("未找到加密狗或加密狗版本不一致!"));
  84. return false;
  85. }
  86. #ifdef CONNCOUNT_VERSION // Jeff.座席版;
  87. {
  88. int value[8];
  89. double f[8];
  90. TCHAR s0[50]=_T(""),s1[50]=_T(""),s2[50]=_T(""),s3[50]=_T(""),s4[50]=_T(""),s5[50]=_T(""),s6[50]=_T(""),s7[50]=_T("");
  91. //运行自定义函数
  92. int ret=ytSoftKey.getdata(&value[0],&value[1],&value[2],&value[3],&value[4],&value[5],&value[6],&value[7],
  93. &f[0],&f[1],&f[2],&f[3],&f[4],&f[5],&f[6],&f[7],
  94. s0,s1,s2,s3,s4,s5,s6,s7);
  95. if(ret!=0 && ret!=-43)
  96. {
  97. g_conncount=-1; // Jeff:S0 存储着座席数量;
  98. }
  99. else
  100. {
  101. g_conncount=atoi(s0); // Jeff:S0 存储着座席数量;
  102. g_sdomain=s1;
  103. g_bReg=atoi(s2); // ???医院跟踪系统??
  104. }
  105. }
  106. #else
  107. {
  108. int value[8];
  109. double f[8];
  110. TCHAR s0[50]=_T(""),s1[50]=_T(""),s2[50]=_T(""),s3[50]=_T(""),s4[50]=_T(""),s5[50]=_T(""),s6[50]=_T(""),s7[50]=_T("");
  111. //运行自定义函数
  112. int ret=ytSoftKey.getdata(&value[0],&value[1],&value[2],&value[3],&value[4],&value[5],&value[6],&value[7],
  113. &f[0],&f[1],&f[2],&f[3],&f[4],&f[5],&f[6],&f[7],
  114. s0,s1,s2,s3,s4,s5,s6,s7);
  115. if(ret!=0 && ret!=-43)
  116. {
  117. }
  118. else
  119. {
  120. g_sdomain=s1;
  121. g_bReg=atoi(s2);
  122. }
  123. }
  124. #endif
  125. if ( g_sdomain.IsEmpty() )
  126. {
  127. AfxMessageBox(_T("加密锁域名为空,无法启动服务器!"));
  128. return FALSE;
  129. }
  130. CString savedir=g_mainpath+"\\数据备份";
  131. if(!CheckFolderFileExist (savedir))
  132. ::CreateDirectory (savedir, NULL);
  133. ::CoInitialize( NULL );
  134. BOOL bMasterDb=0;
  135. BOOL bUserDb=0;
  136. // 4.连接master数据库,判断数据库连接是否正常;
  137. CDatabase masterdb; // Jeff:master用于附加与分离数据库;
  138. try
  139. {
  140. TCHAR szConnectString[MAX_PATH] = _T("");
  141. if( g_dwDBServerPort != 0)
  142. {
  143. if ( _tcscmp(g_szDBAccount, _T("")) == 0 )
  144. _stprintf_s(szConnectString, DB_SW_CONN_WITH_PORT, g_szDBSource,g_dwDBServerPort, _T("master"));
  145. else
  146. _stprintf_s(szConnectString, DB_SS_CONN_WITH_PORT,g_szDBSource,g_dwDBServerPort, _T("master"), g_szDBAccount,g_szDBPassWord);
  147. }
  148. else
  149. {
  150. if ( _tcscmp(g_szDBAccount, _T("")) == 0 )
  151. _stprintf_s(szConnectString, DB_SW_CONN_WITHOUT_PORT, g_szDBSource, _T("master"));
  152. else
  153. _stprintf_s(szConnectString, DB_SS_CONN_WITHOUT_PORT, g_szDBSource, _T("master"), g_szDBAccount, g_szDBPassWord);
  154. }
  155. masterdb.OpenEx(szConnectString,CDatabase::noOdbcDialog);
  156. bMasterDb=1;
  157. }
  158. catch(CDBException * e)
  159. {
  160. #ifdef _DEBUG
  161. e->ReportError();
  162. #endif
  163. e->Delete();
  164. }
  165. if(bMasterDb==0)
  166. {
  167. WriteTextLog(_T("sql数据库未启动!"));
  168. ShellExecute(NULL, _T("open"), g_mainpath+"\\AutoRun.exe", NULL, NULL, SW_HIDE);
  169. return false;
  170. }
  171. CODBCPool *pdbpool = new CODBCPool;
  172. if ( pdbpool->InitializePool(g_szDBSource, g_dwDBServerPort, g_szDBAccount, g_szDBPassWord, g_szDBName, g_dwDBPoolDef, g_dwDBPoolMaxCount) )
  173. {
  174. g_dbpool.Add(pdbpool);
  175. bUserDb=1;
  176. BackupDatabase(savedir, 1, 0); // Jeff. savedir=\\数据备份
  177. CDatabase *pdb = NULL;
  178. ODBCConnGuard ConnGuard(pdb, -1, 3000);
  179. CString strSQL;
  180. strSQL.Format(_T("update path set path1='%s'"), g_sdomain);
  181. if ( pdb )
  182. {
  183. try
  184. {
  185. pdb->ExecuteSQL(strSQL);
  186. pdb->ExecuteSQL(_T("IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[historydb]') AND type in (N'U')) CREATE TABLE [historydb]([year] VARCHAR(50))"));
  187. }
  188. catch (CDBException* e)
  189. {
  190. WriteTextLog(_T("%s-<%d>-%s,%s"), __FILE__, __LINE__, __FUNCTION__, e->m_strError);
  191. e->Delete();
  192. }
  193. }
  194. try
  195. {
  196. // 生成guid值;
  197. CRecordset rst(pdb);
  198. rst.Open(CRecordset::forwardOnly, _T("select reverse4,reverse5 from version"));
  199. rst.GetFieldValue(_T("reverse4"), g_strExecResult);
  200. rst.GetFieldValue(_T("reverse5"), g_strStudioGuid);
  201. rst.Close();
  202. if ( g_strStudioGuid.IsEmpty() || g_strStudioGuid.GetLength() < 32 )
  203. {
  204. strSQL.Format(_T("update version set reverse5 = '%s'"), GetGuidString());
  205. pdb->ExecuteSQL(strSQL);
  206. }
  207. }
  208. catch (CDBException* e)
  209. {
  210. WriteTextLog(_T("%s-<%d>-%s,%s"), __FILE__, __LINE__, __FUNCTION__, e->m_strError);
  211. e->Delete();
  212. }
  213. // 判断Guard伪装文件是否在在;
  214. if ( PathFileExists(g_mainpath + _T("\\系统文件\\skin\\7.lia")) )
  215. {
  216. CFile cf;
  217. if ( cf.Open(g_mainpath + _T("\\系统文件\\skin\\7.lia"), CFile::modeRead) )
  218. {
  219. DWORD dwSize = cf.GetLength();
  220. BYTE* pbuffer = new BYTE[dwSize];
  221. memset(pbuffer, 0, dwSize);
  222. cf.Read(pbuffer, dwSize);
  223. // 1.获取文件内容,并序列化到对象中;
  224. CArchive ar(&cf, CArchive::load);
  225. g_GuardCommand.Serialize(ar);
  226. ar.Close();
  227. cf.Close();
  228. if ( pbuffer )
  229. delete []pbuffer;
  230. // 2.获取父对象内容,算出md5值;
  231. CGuardCommand tagGuardCommand;
  232. tagGuardCommand = *((CGuardCommand*)&g_GuardCommand);
  233. CMemFile cmf;
  234. CArchive ar2(&cmf, CArchive::load);
  235. tagGuardCommand.Serialize(ar2);
  236. dwSize = cmf.GetLength();
  237. BYTE *pData = cmf.Detach();
  238. CMD5 md5(pData, dwSize);
  239. _stprintf_s(g_szGuardcmdMd5, _T("%s"), md5.GetMD5Digest());
  240. if ( pData )
  241. delete []pData;
  242. }
  243. }
  244. }
  245. else
  246. {
  247. delete pdbpool;
  248. }
  249. if(bUserDb==0 && bMasterDb)
  250. {
  251. CString autorunpath=g_mainpath+"\\AutoRun.exe";
  252. ShellExecute(NULL, _T("open"), autorunpath, NULL, NULL, SW_HIDE);
  253. WriteTextLog("数据库初始化中...");
  254. TCHAR szDBFile[MAX_PATH] = _T("");
  255. _stprintf_s(szDBFile, _T("%s\\数据\\%s.mdf"), g_mainpath.GetString(), g_szDBName);
  256. if(::PathFileExists(szDBFile) == 0 )
  257. {
  258. WriteTextLog("数据库文件丢失!");
  259. return false;
  260. }
  261. BOOL bLog=0;
  262. TCHAR szDBLogFile[MAX_PATH] = _T("");
  263. _stprintf_s(szDBLogFile, _T("%s\\数据\\%s_log.ldf"), g_mainpath.GetString(), g_szDBName);
  264. if(::PathFileExists(szDBLogFile) == 0 )
  265. {
  266. bLog=1;
  267. }
  268. CString sql;
  269. try
  270. {
  271. // g_masterdb.ExecuteSQL ("exec sp_detach_db db");
  272. }
  273. catch(CDBException * e)
  274. {
  275. #ifdef _DEBUG
  276. e->ReportError();
  277. #endif
  278. e->Delete();
  279. }
  280. if(bLog)
  281. sql.Format("exec sp_attach_db '%s',@filename1='%s\\数据\\%s.mdf',@filename2='%s\\数据\\%s_log.ldf'",g_szDBName,g_ModulePath,g_szDBName,g_ModulePath,g_szDBName);
  282. else
  283. sql.Format("exec sp_attach_db '%s',@filename1='%s\\数据\\%s.mdf'", g_szDBName,g_ModulePath,g_szDBName);
  284. try
  285. {
  286. masterdb.ExecuteSQL (sql); // 同master数据库去执行附加和分离;
  287. }
  288. catch(CDBException * e)
  289. {
  290. masterdb.Close();
  291. WriteTextLog(e->m_strError);
  292. WriteTextLog("数据库初始化失败!");
  293. #ifdef _DEBUG
  294. e->ReportError();
  295. #endif
  296. e->Delete();
  297. return false;
  298. }
  299. masterdb.Close();
  300. WriteTextLog("数据库初始化完成,请重新启动系统!");
  301. return false;
  302. }
  303. // 在数据库完成初始化后,判断本地目录下是否有MSCHRT20.OCX文件,无则从数据库下载;2014.09.06
  304. // 客户端从dwToUserID==211里传递MSCHRT20.OCX;
  305. CString strMSCHRTOCX = g_mainpath+"\\系统文件\\MSCHRT20.OCX";
  306. OFSTRUCT ofStruct;
  307. OpenFile(strMSCHRTOCX,&ofStruct,OF_EXIST);
  308. if( ERROR_FILE_NOT_FOUND == GetLastError())
  309. {
  310. CDatabase *pdb = NULL;
  311. ODBCConnGuard ConnGuard(pdb, -1, 3000);
  312. if ( pdb )
  313. {
  314. CRstUpdate rsSt;
  315. rsSt.m_pDatabase = pdb;
  316. rsSt.Open();
  317. if(!rsSt.IsEOF())
  318. {
  319. CFile fp;
  320. if(fp.Open(strMSCHRTOCX, CFile::modeCreate|CFile::modeWrite))
  321. {
  322. void *pData = GlobalLock(rsSt.m_lbOCX.m_hData);
  323. fp.Write(pData, rsSt.m_lbOCX.m_dwDataLength);
  324. fp.Close();
  325. GlobalUnlock(rsSt.m_lbOCX.m_hData);
  326. }
  327. }
  328. rsSt.Close();
  329. }
  330. }
  331. ULONG_PTR gdiplusToken;
  332. GdiplusStartupInput gdiplusStartupInput;
  333. GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
  334. CString path1="客户原片(管理软件)$";
  335. CString path2="修好的片(管理软件)$";
  336. CString path3="设计好的片(管理软件)$";
  337. CString path4="精修好的片(管理软件)$";
  338. CString path5="礼服图片(管理软件)$";
  339. CString path6="电话录音(管理软件)$";
  340. CString temp;
  341. if(CheckFolderFileExist (g_mainpath+"\\"+path1))
  342. {
  343. temp.Format ("net share %s=%s\\%s", path1, g_mainpath, path1);
  344. WinExec(temp,SW_HIDE);
  345. }
  346. if(CheckFolderFileExist (g_mainpath+"\\"+path2))
  347. {
  348. temp.Format ("net share %s=%s\\%s", path2, g_mainpath, path2);
  349. WinExec(temp,SW_HIDE);
  350. }
  351. if(CheckFolderFileExist (g_mainpath+"\\"+path3))
  352. {
  353. temp.Format ("net share %s=%s\\%s", path3, g_mainpath, path3);
  354. WinExec(temp,SW_HIDE);
  355. }
  356. if(CheckFolderFileExist (g_mainpath+"\\"+path4))
  357. {
  358. temp.Format ("net share %s=%s\\%s", path4, g_mainpath, path4);
  359. WinExec(temp,SW_HIDE);
  360. }
  361. if(CheckFolderFileExist (g_mainpath+"\\"+path5))
  362. {
  363. temp.Format ("net share %s=%s\\%s", path5, g_mainpath, path5);
  364. WinExec(temp,SW_HIDE);
  365. }
  366. if(CheckFolderFileExist (g_mainpath+"\\"+path6))
  367. {
  368. temp.Format ("net share %s=%s\\%s", path6, g_mainpath, path6);
  369. WinExec(temp,SW_HIDE);
  370. }
  371. CString autorunpath=g_mainpath+"\\AutoRun.exe";
  372. ShellExecute(NULL, _T("open"), autorunpath, NULL, NULL, SW_HIDE);
  373. #ifdef ENTERPRISE_VERSION
  374. autorunpath=g_mainpath+"\\DataSyncReceive.exe";
  375. ShellExecute(NULL, _T("open"), autorunpath, NULL, NULL, SW_HIDE);
  376. autorunpath=g_mainpath+"\\DataSyncSend.exe";
  377. ShellExecute(NULL, _T("open"), autorunpath, NULL, NULL, SW_HIDE);
  378. autorunpath=g_mainpath+"\\CPhotoFTPReceive.exe";
  379. ShellExecute(NULL, _T("open"), autorunpath, NULL, NULL, SW_HIDE);
  380. autorunpath=g_mainpath+"\\CPhotoFTPSend.exe";
  381. ShellExecute(NULL, _T("open"), autorunpath, NULL, NULL, SW_HIDE);
  382. #endif
  383. // Standard initialization
  384. // If you are not using these features and wish to reduce the size
  385. // of your final executable, you should remove from the following
  386. // the specific initialization routines you do not need.
  387. #ifdef _AFXDLL
  388. Enable3dControls(); // Call this when using MFC in a shared DLL
  389. #else
  390. Enable3dControlsStatic(); // Call this when linking to MFC statically
  391. #endif
  392. InitCommonControls();
  393. CDBServerDlg dlg;
  394. m_pMainWnd = &dlg;
  395. int nResponse = dlg.DoModal();
  396. if (nResponse == IDOK)
  397. {
  398. }
  399. else if (nResponse == IDCANCEL)
  400. {
  401. }
  402. GdiplusShutdown(gdiplusToken);
  403. g_Instance = AfxGetResourceHandle();
  404. return FALSE;
  405. }
  406. void CDBServer::OnAppShow()
  407. {
  408. if (m_pMainWnd)
  409. m_pMainWnd->ShowWindow(SW_SHOW);
  410. }
  411. void CDBServer::OnAppExit()
  412. {
  413. //御载lyfzBackupModle.dll
  414. m_pMainWnd->DestroyWindow();
  415. }
  416. void CDBServer::OnAppAbout()
  417. {
  418. }
  419. /********************************************************************/
  420. /* */
  421. /* Function name : OnHelpIndex */
  422. /* Description : Command to show help file. */
  423. /* */
  424. /********************************************************************/
  425. void CDBServer::OnHelpIndex()
  426. {
  427. // launch help
  428. // ::WinHelp(AfxGetMainWnd()->m_hWnd, AfxGetApp()->m_pszHelpFilePath, HELP_CONTENTS, 0L);
  429. }
  430. int CDBServer::ExitInstance()
  431. {
  432. // 释放Socket库;
  433. ReleaseSocketLibrary();
  434. return CWinApp::ExitInstance();
  435. }