{"id":609,"date":"2008-05-16T09:22:04","date_gmt":"2008-05-16T09:22:04","guid":{"rendered":"http:\/\/6teen.ru\/?p=638"},"modified":"2008-05-16T09:22:04","modified_gmt":"2008-05-16T09:22:04","slug":"6810-2","status":"publish","type":"post","link":"http:\/\/pblog.ru\/lab\/?p=609","title":{"rendered":"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u0441\u0436\u0430\u0442\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0444\u0430\u0439\u043b\u0430 \u0431\u0430\u0437\u044b Interbase"},"content":{"rendered":"<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u0441\u0436\u0430\u0442\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0444\u0430\u0439\u043b\u0430 \u0431\u0430\u0437\u044b Interbase<br \/>\n<!--more--><\/p>\n<pre class=\"alt2\" style=\"margin:0px; padding:6px; border:1px inset; width:580px; height:320px; overflow:auto\"><div>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u0441\u0436\u0430\u0442\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0444\u0430\u0439\u043b\u0430 \u0431\u0430\u0437\u044b Interbase\n\n\u0410\u0432\u0442\u043e\u0440: \u0421\u0430\u043f\u0440\u043e\u043d\u043e\u0432 \u0410\u043b\u0435\u043a\u0441\u0435\u0439(Savva)\n\n\u041f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \"\u0441\u0436\u0430\u0442\u0438\u044f\" \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 IB. \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b: \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445,\n\u0438\u043c\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 IB. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: true - \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0430\u0441\u044c\n\u0443\u0441\u043f\u0435\u0448\u043d\u043e, false - \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\n\u0443\u0442\u0438\u043b\u0438\u0442\u0443 gbak.exe \u0438\u0438\u0437 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 InterBase\n\n\u041b\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435.\n\u0420\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0442\u044f\u0436\u0435\u043b\u0435\u0435\n\u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043d\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043c\u0443\u0441\u043e\u0440 (\u0431\u0430\u0437\u0430 \u0436\u0435 \u043f\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u0430\u044f). Interbase \u0434\u0435\u043b\u0430\u0435\u0442\n\u0441\u0430\u043c \u0441\u0431\u043e\u0440\u043a\u0443 \"\u043c\u0443\u0441\u043e\u0440\u0430\" (sweep),\u043d\u043e \u043f\u043e\u0441\u043b\u0435 20000 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e) \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439.\n\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b \u0431\u0430\u0437\u044b \u043d\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f. \u0427\u0442\u043e \u0431\u044b \u0435\u0433\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c\n\u0440\u0435\u0437\u0435\u0440\u0432\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e, \u0430 \u043f\u043e\u0442\u043e\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0438 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.\n\n\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:\nForms (\u0434\u043b\u044f \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0447\u0430\u0441\u0438\u043a\u0430\u043c\u0438), Registry, Windows, SysUtils, Dialogs\n\nfunction CompactInterBaseDatabase(DatabaseName, UserName, Password: string):\nboolean;\nvar\ntmpStr: array[0..MAX_PATH] of Char;\nTempPath: string; \/\/ \u043f\u0443\u0442\u044c\nib_path: string; \/\/ \u043f\u0443\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0430 IB\nTempName: string; \/\/ \u0438\u043c\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430\nbckName: string; \/\/\nreg: TRegistry;\nsi: STARTUPINFO;\npi: PROCESS_INFORMATION;\ncmdline: string;\nSaveCursor: TCursor;\nbegin\n{\n\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n-B(ACKUP_DATABASE) backup database to file\n-C(REATE_DATABASE) create database from backup file\n-PAS InterBase password\n-USER InterBase user name\n}\nresult := false;\nSaveCursor := Screen.Cursor;\nScreen.Cursor := crHourGlass; \/\/ \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0447\u0430\u0441\u0438\u043a\u0438\ntry\ntry \/\/ \u0434\u043e\u0441\u0442\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 IB\nReg := TRegistry.Create;\nReg.RootKey := HKEY_LOCAL_MACHINE;\nReg.OpenKey('SOFTWARE\\Borland\\InterBase\\CurrentVersion', False);\nib_path := Reg.ReadString('ServerDirectory');\nfinally\nReg.Free;\nend;\n\nbckName := ChangeFileExt(ExtractFileName(DatabaseName), '.tmp');\n\/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430\nTempPath := ExtractFilePath(DatabaseName);\nif TempPath = '' then\nbegin\nTempPath := GetCurrentDir;\nDatabaseName := TempPath + '\\' + DatabaseName;\nend;\n\/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043c\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430\nGetTempFileName(PChar(TempPath), 'gdb', 0, tmpStr);\nTempName := StrPas(tmpStr);\n\/\/ \u043c\u0435\u043d\u044f\u0435\u043c \u0435\u043c\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\nTempName := TempPath + '\\' + ChangeFileExt(ExtractFileName(TempName),\n'.gdb');\nDeleteFile(PChar(TempName)); \/\/ \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c :))\n\nZeroMemory(@si, sizeof(si));\nsi.cb := SizeOf(si);\n\/\/ \u043f\u0440\u044f\u0447\u0435\u043c \u0447\u0435\u0440\u043d\u043e\u0435 \u043e\u043a\u043e\u0448\u043a\u043e. \u0415\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0434\u043e \u043f\u0440\u044f\u0442\u0430\u0442\u044c - \u0442\u043e \u043d\u0430\u0434\u043e\n\/\/ \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u044d\u0442\u0438 2 \u0441\u0442\u0440\u043e\u043a\u0438\nsi.dwFlags := STARTF_USESHOWWINDOW;\nsi.wShowWindow := SW_HIDE;\n\/\/-----------------------\ncmdline := ib_path + 'gbak.exe -b ' + DatabaseName + ' ' + TempName +\n' -pas ' + Password + ' -user ' + UserName;\nif not CreateProcess(nil, \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443.\nPChar(cmdline), \/\/ \u041a\u043e\u043c\u0430\u043d\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430.\nnil,\nnil, \/\/\nFalse, \/\/\n0, \/\/ \u0444\u043b\u0430\u0433\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f\nnil, \/\/ \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u043c\nnil, \/\/ \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u043d\u0430\nsi, \/\/ \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 STARTUPINFO .\npi) {\/\/ \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 PROCESS_INFORMATION .} then\nbegin\nraise ERangeError.CreateFmt(\n'Error in CompactInterBaseDatabase'#10#13'%s '  ,\n['CreateProcess failed.']);\nend;\nWaitForSingleObject(pi.hProcess, INFINITE); \/\/ \u0436\u0434\u0435\u043c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0434\u043e\u043b\u0433\u043e :)\nCloseHandle(pi.hProcess); \/\/ \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u0434\u043e\nCloseHandle(pi.hThread); \/\/ \u0443\u0431\u0438\u0440\u0430\u0442\u044c\nRenameFile(DatabaseName, bckName);\n\/\/ \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043d\u0435 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0431\u0430\u0437\u0443 - \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\ncmdline := ib_path + 'gbak.exe -c ' + TempName + ' ' + DatabaseName +\n' -pas ' + Password + ' -user ' + UserName;\nif not CreateProcess(nil, \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443.\nPChar(cmdline), \/\/ \u041a\u043e\u043c\u0430\u043d\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430.\nnil,\nnil, \/\/\nFalse, \/\/\n0, \/\/ \u0444\u043b\u0430\u0433\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f\nnil, \/\/ \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u043c\nnil, \/\/ \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u043d\u0430\nsi, \/\/ \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 STARTUPINFO .\npi) {\/\/ \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 PROCESS_INFORMATION .} then\nbegin\nraise ERangeError.CreateFmt(\n'Error in CompactInterBaseDatabase'#10#13'%s '  ,\n['CreateProcess failed.']);\nend;\nWaitForSingleObject(pi.hProcess, INFINITE); \/\/ \u0436\u0434\u0435\u043c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0434\u043e\u043b\u0433\u043e :)\nCloseHandle(pi.hProcess); \/\/ \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u0434\u043e\nCloseHandle(pi.hThread); \/\/ \u0443\u0431\u0438\u0440\u0430\u0442\u044c\n\nDeleteFile(PChar(TempName)); \/\/ \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b\nDeleteFile(PChar(bckName)); \/\/ \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043d\u0435 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0431\u0430\u0437\u0443\nresult := true; \/\/\u0432\u0441\u0435 \u0432\u0440\u043e\u0434\u0435 \u0432\u044b\u0448\u043b\u043e\nexcept \/\/ \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0435 :)) \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432\u0441\u0435 \u043a \u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0432\u0438\u0434\u0443\non E: Exception do\nbegin\nRenameFile(bckName, DatabaseName); \/\/ \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043d\u0435 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0431\u0430\u0437\u0443\nDeleteFile(PChar(TempName)); \/\/ \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b\nresult := false; \/\/ \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u0435\u043d\n\/\/ \u0432\u044b\u0434\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438\nShowMessage(e.message);\nend;\nScreen.Cursor := SaveCursor; \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0430 \u043c\u0435\u0441\u0442\u043e\nend;\n\n\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:\n...\nif CompactInterBaseDatabase('any_db.gdb', 'SYSDBA', 'masterkey') then\nShowMessage('Done!');\n<\/div><\/pre>\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u0441\u0436\u0430\u0442\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0444\u0430\u0439\u043b\u0430 \u0431\u0430\u0437\u044b Interbase<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[412,434],"tags":[1913,187,1623,1665,1717,342],"_links":{"self":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/posts\/609"}],"collection":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=609"}],"version-history":[{"count":0,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/posts\/609\/revisions"}],"wp:attachment":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=609"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=609"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=609"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}