"Поток сознания" о тестировании и программировании
Заметки о тестировании, программировании и прочий "поток сознания", который жалко писать "в стол"
понедельник, 20 апреля 2026 г.
Как я исправляю ошибки
https://18delphi.blogspot.com/2013/03/blog-post_54.html
"Shit happens". Это постулат.
Если я получаю ошибку в разработку, то я делаю примерно следующее:
1. Выясняю все необходимые детали, если они ещё не выяснены.
2. Пишу тест (или прошу коллег сделать это, есть люди - более подкованные).
3. Идеально, если получается тест на синтетических данных и в "песочнице", а не на реальном приложении.
4. Если не получается, то я делаю скриптовый тест к реальному приложению. (Может быть когда-нибудь я дойду до того - как я это делаю)
5. Запускаю тест, убеждаюсь, что он падает.
6. Кладу тест и его эталоны в репозитарий.
7. Отлаживаю ошибку используя тест как полигон для испытаний.
8. Исправляю ошибку.
9. Убеждаюсь, что тест не падает.
10. Кладу исправленный код, тест и эталоны в репозитарий.
11. Прогоняю другие тесты.
12. Смотрю на упавшие.
13. Из упавших отбираю те где "это не ошибка, а стало только лучше". Исправляю эти тесты или их эталоны.
14. Исправляю остальные упавшие тесты или привлекаю коллег или УБЕЖДАЮСЬ в противоречивости ТЗ (тут надо писать ОТДЕЛЬНЫЙ пост - отчасти тут - http://18delphi.blogspot.com/2013/04/blog-post.html).
15. Прогоняю все тесты.
16. Убеждаюсь, что ошибок больше нет.
17. ОСТАВЛЯЮ НОВЫЙ тест в репозитарии тестов. ОТНЫНЕ - он работает на меня.
18. Сплю спокойно.
Попробуйте. Может быть и вам - понравится.
О рекламе...
Ужас не в том, что это случится.
Ужас в том, что большинство не заметит. Или заметит, но не поймёт, почему это плохо.
«Ну подумаешь, песня в рекламе. Ну подумаешь, панибратское "Юра". Ну подумаешь, "блямс" вместо "бля".
О книгах...
https://18delphi.blogspot.com/2013/03/blog-post_2036.html
Джоэл Спольски — «перечитываю в КАЖДЫЕ новогодние каникулы». Джоэл пишет о здравом смысле, о том, как не надо переписывать код с нуля, о важности тестов и документации. Это ваш союзник в борьбе с фальшью.
-- уже не перечитываю. :(
Но помню.
Да и вообще... Честно скажу.
К сожалению лет 10 я уже не читаю книги. :-( Их заменили соцсети. А теперь уже и ИИ. Честно скажу - "ушла привычка читать большие тексты".
Basic tests for port from Delphi to FPC
program fpcunitproject1;
// - basic tests for port from Delphi to FPC
{$mode objfpc}{$H+}
{$Define l3DisableDelphiMode}
{$Include l3Define.inc}
uses
l3IntfUses
{$IFDEF UNIX}
, cthreads
{$ENDIF}
, Interfaces // this includes the LCL widgetset
, l3ExceptionsLog
, fpcunit
, testregistry
, l3ExceptionsLogEx
, l3Logger
, l3Base
, l3ProtoObject
, l3SimpleObject
, utGUITestsRunner
, printer4lazarus
, fpvectorialpkg
, indylaz
, primtestcase1
, primtestcase2
, l3ScreenIC
, utBaseTest
, utOutputTest
, TestCase1
// ---------------------------------
, TestCases
// ---------------------------------
, UnicodeTestCases
// ---------------------------------
, utMSSTests
// - подключаем скрипты
// ---------------------------------
, tfwTypeModifier
, tfwScriptingInterfaces
, vcmInsiderTest
, CustomInsiderScripter
, Ik2TagReaderWordsPack
, Ik2TagWriterWordsPack
, Ik2TagGeneratorWordsPack
, evdNativeWriter
, ddRTFWriterRegister
, evdAllDocumentSubsEliminator
, evDocumentValidator
, ddHTMLWriter
, evdXMLWriter
//, ddHTMLWriter
, afwCustomCaretType
//, tfwScriptingInterfaces
, m3DBCheckRunner in '..\..\..\components\m3DBCheck\m3DBCheckRunner.pas'
;
{$R *.res}
begin
TutMSSTests.Register;
// - Регистрируем скриптовые тесты
TutGUITestsRunner.Run;
(*
[*
+-----------------------------------------------------------------------+
| fpcunitproject1 - ГЛАВНЫЙ ТЕСТОВЫЙ ПРОЕКТ FPC |
| ============================================= |
| |
| Назначение: портирование системы с Delphi на Free Pascal |
| Единая точка входа для всех тестов под FPC |
| (Windows и Linux) |
| |
+-----------------------------------------------------------------------+
+-----------------------------------------------------------------------+
| СТРУКТУРА ПРОЕКТА |
+-----------------------------------------------------------------------+
┌─────────────────────────────────────────────────────────────────────┐
│ fpcunitproject1.dpr │
├─────────────────────────────────────────────────────────────────────┤
│ {$mode objfpc}{$H+} // режим Object Pascal, длинные строки │
│ {$R *.res} // ресурсы │
└─────────────────────────────────────────────────────────────────────┘
│
v
┌─────────────────────────────────────────────────────────────────────┐
│ TutGUITestsRunner.Run │
│ (графический тестовый раннер) │
└─────────────────────────────────────────────────────────────────────┘
│
┌───────────────────────────┼───────────────────────────┐
v v v
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ СТАНДАРТНЫЕ │ │ СКРИПТОВЫЕ │ │ УТИЛИТЫ │
│ ТЕСТЫ │ │ ТЕСТЫ │ │ │
└─────────────┘ └─────────────┘ └─────────────┘
+-----------------------------------------------------------------------+
| СОСТАВ ПРОЕКТА (ПОДКЛЮЧЁННЫЕ МОДУЛИ) |
+-----------------------------------------------------------------------+
┌─────────────────────────────────────────────────────────────────────┐
│ 1. ФУНДАМЕНТ (L3) │
├─────────────────────────────────────────────────────────────────────┤
│ l3IntfUses // интерфейсы L3 │
│ l3ExceptionsLog // базовый логгер │
│ l3ExceptionsLogEx // логгер без автоперехвата │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 2. ТЕСТОВЫЕ БАЗОВЫЕ КЛАССЫ │
├─────────────────────────────────────────────────────────────────────┤
│ utGUITestsRunner // графический раннер │
│ utBaseTest // базовый класс тестов │
│ utOutputTest // тесты с выводом │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 3. СТАНДАРТНЫЕ ТЕСТЫ │
├─────────────────────────────────────────────────────────────────────┤
│ primtestcase1 // примитивные тесты (часть 1) │
│ primtestcase2 // примитивные тесты (часть 2) │
│ TestCase1 // тесты общего назначения │
│ TestCases // набор тестов │
│ UnicodeTestCases // тесты Unicode/кодировок │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 4. СКРИПТОВЫЕ ТЕСТЫ │
├─────────────────────────────────────────────────────────────────────┤
│ DailyAutoTestFPC // регистрация автоматических скриптовых тестов│
│ │
│ tfwTypeModifier // модификаторы типов (скриптовый движок) │
│ tfwScriptingInterfaces // интерфейсы скриптов │
│ vcmInsiderTest // внутренние тесты VCM │
│ CustomInsiderScripter // кастомный скриптер │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 5. K2 / EVD (МОДЕЛЬ ДАННЫХ) │
├─────────────────────────────────────────────────────────────────────┤
│ Ik2TagReaderWordsPack // чтение тегов │
│ Ik2TagWriterWordsPack // запись тегов │
│ Ik2TagGeneratorWordsPack // генерация тегов │
│ evdNativeWriter // запись EVD │
│ evdAllDocumentSubsEliminator // фильтр сабов │
│ evdXMLWriter // запись EVD в XML │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 6. ЭКСПОРТ (RTF, HTML, DOCX) │
├─────────────────────────────────────────────────────────────────────┤
│ ddRTFWriterRegister // регистрация RTF-писателя │
│ ddHTMLWriter // HTML-писатель (закомментирован) │
│ evDocumentValidator // валидатор документов │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 7. GUI-КОМПОНЕНТЫ │
├─────────────────────────────────────────────────────────────────────┤
│ afwCustomCaretType // каретка (текстовый курсор) │
│ printer4lazarus // печать (Lazarus) │
│ fpvectorialpkg // векторная графика (SVG, etc) │
│ indylaz // интернет-компоненты (Indy) │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 8. УТИЛИТЫ │
├─────────────────────────────────────────────────────────────────────┤
│ m3DBCheckRunner // утилита проверки базы данных │
└─────────────────────────────────────────────────────────────────────┘
+-----------------------------------------------------------------------+
| ПОРЯДОК ЗАПУСКА |
+-----------------------------------------------------------------------+
1. Регистрация скриптовых тестов
│
v
RegisterDailyAutoTestsFPC;
│
│ (регистрирует тесты из .ms.script файлов)
│
v
2. Запуск графического раннера
│
v
TutGUITestsRunner.Run;
│
│ (отображает окно со списком всех зарегистрированных тестов)
│
v
3. Пользователь выбирает тесты и запускает их
│
v
4. Тесты выполняются, результаты отображаются в GUI
+-----------------------------------------------------------------------+
| КЛЮЧЕВЫЕ ОСОБЕННОСТИ |
+-----------------------------------------------------------------------+
┌─────────────────────────────────────────────────────────────────────┐
│ 1. КРОССПЛАТФОРМЕННОСТЬ │
│ - {$IFDEF UNIX} cthreads {$ENDIF} // поддержка потоков в Linux │
│ - режим objfpc (Object Pascal) для совместимости с Delphi │
│ - длинные строки {$H+} для AnsiString │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 2. ИНТЕГРАЦИЯ СКРИПТОВ │
│ - скриптовые тесты регистрируются через RegisterDailyAutoTestsFPC│
│ - скриптовый движок (tfw) подключен │
│ - vcmInsiderTest, CustomInsiderScripter для внутренних тестов │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 3. ПОЛНЫЙ ОХВАТ │
│ - L3 (фундамент) │
│ - K2/evd (модель данных) │
│ - Экспорт (RTF, HTML) │
│ - GUI-компоненты (afw, printer, fpvectorial) │
│ - Утилиты (m3DBCheck) │
└─────────────────────────────────────────────────────────────────────┘
+-----------------------------------------------------------------------+
| ЗАДАЧА |
+-----------------------------------------------------------------------+
| |
| Этот проект доказывает, что портирование системы с Delphi на FPC |
| успешно завершено. Все ключевые компоненты: |
| - L3 (логирование, ссылочная модель) |
| - K2 (модель данных) |
| - Эверест (редактор) |
| - m3 (индексы, хранилище) |
| - Экспорт (RTF, HTML, PDF) |
| - Скрипты (tfw) |
| |
| работают как под Windows, так и под Linux. |
| |
| Запуск этого проекта — финальная проверка перед релизом. |
| |
+-----------------------------------------------------------------------+
*]
*)
end.
TestCases
{$IfDef FPC}
{$CodePage utf8}
{.$CodePage cp1251}
{$EndIf FPC}
unit TestCases;
{$Include l3Define.inc}
interface
uses
l3IntfUses
{$IFDEF Linux}
, cwstring
{$ENDIF}
, Classes
, l3Stubs
, l3CoreInterfaces
, l3ExitProcsList
, l3String
, utBaseTest
, utOutputTest
, l3MemUtils
, l3AllocatedPointersTrace
, l3FileUtils
, l3FileSearch
, l3FileSearchWithExcludeMask
, l3Core
, l3Interfaces
, l3BaseStream
, l3Stream
, l3Clipboard
, l3HandleStream
, l3StringStream
, l3Parser
, l3Ptr
, l3PtrLoc
, l3ZLibUtils
, m2TMPLib
, m2comlib
, LockDeltasTest
, EOLWriteTest
, EOLWriteTest1
, EOLWriteTest2
, l3CustomMemoryStream
, l3MemoryStream
, l3TempMemoryStream
, l3ExclusiveTempMemoryStream
, l3ExclusiveTempFileStream
, l3TempMemoryStreamNewTest
, l3TempFileStreamTest
, l3TempFileStreamExTest
, l3TempFileStreamBufferedTest
, l3TempMemoryStreamExTest
, l3TempMemoryStreamSetSizeExTest
, l3ActiveXtypes_Proxy
, l3DataObject
, l3DataObjectEnum
, l3RegEx
, TestCaseCheck
, TestCaseCheck1
, TestCase1
, TestCase2
, TestCase3
, TestCase4
, TestCase5
, TestCase6
, TestCase7
, TestCase8
, TestCase9
, TestCase10
, TestCase11
, TestCase12
, TestCase13
, TestCase14
, TestCase15
, TestCase16
, TestCase17
, TestCase_802064420_cc_WordDelimANSISet_Prim
, l3ProtoObject
, TestCase_802064420_cc_WordDelimANSISet
, TestCase_802064420_cc_WordDelimOEMSet
, TestCase18
//, tcO1
//, tcO2
, TestCase19
, TestCase20
//, tcS1
//, tcS2
, l3Base
, l3LongintListPrim
, l3LongintList
, l3Chars
{.$IfNDef Linux}
, Bool_Wrap
, k2Base
, evdCore_Schema
, evdNative_Schema
, evNative_Schema
{.$EndIf Linux}
, l3ProtoDataContainer
, l3CustomString
, l3BaseWithIDList
, evdNativeReader
, GroupOperationTest
, GroupOperationTest1
, GroupOperationTest2
, GroupOperationTest3
, GroupOperationTest4
, GroupOperationTest5
, m3SetInternalIDtoExternalIDLinkTest
, m3DocumentStorageCacher
, l3MarshalledTypes
, evdArchiDicts_Schema
, evdSchema
, AccessMaskTest
, AccessMaskTest1
, AccessMaskTest2
, AccessMaskTest3
, AccessMaskTest4
, AccessMaskTest5
, AccessMaskTest6
, AccessMaskTest7
, AccessMaskTest8
, Il3IntegerEnumerable_DiffTest
, Il3IntegerEnumerable_DiffTest1
, Il3IntegerEnumerable_DiffTest2
, Il3IntegerEnumerable_DiffTest3
, Il3IntegerEnumerable_DiffTest4
{.$IfNDef Linux}
, l3TTFTools
, eeEVDtoPDF
, SynZip
, SynPDF
{.$EndIf Linux}
, l3LogFont
, ddAppConfigConst
, ddRTFWriter
, ddRTFSegmentWriter
, eeEVDtoRTF
, eeRenderFormula
, ddRTFReader
, ZipForge
//, l3ZLibUtils
, l3ZLibDecompressStream
, l3ZLibCompressStream
, m3ZLibDeflateStreamNew
, m3ZLibInflateStreamNew
, ddODTReader
, l3BaseWithLargeIDList
{$IfDef FPC}
, FGL
, tcGeneric1
, GenericTestCase1
, GenericTestCase2
, GenericTestCase3
, GenericTestCase4
, GenericTestCase5
, GenericTestCase6
, GenericTestCase7
, GenericTestCase8
, GenericTestCase9
, GenericTestCase10
, GenericTestCase11
, GenericTestCaseEx
, GenericTestCaseEx1
, GenericTestCaseEx2
, GenericTestCaseEx3
, GenericTestCaseEx4
, GenericTestCaseEx5
, GenericTestCaseEx6
, GenericTestCaseEx7
, GenericTestCaseEx8
, GenericTestCaseEx9
, GenericTestCaseEx10
, GenericTestCaseEx11
{$EndIf FPC}
, OneBytePtrHashTest
, PtrArrayTest
, PtrHashTest
, CopyStreamTest1
, CopyStreamTest2
, EVDtoEVDTest
, EVDtoEVDTest1
, EVDtoEVDTest2
, EVDtoEVDTest3
, EVDtoEVDTest4
, EVDtoEVDTest5
, EVDtoEVDTest6
, EVDtoEVDTest7
, EVDtoEVDTest8
, EVDtoEVDBinTest
, evdStyleContainer
, StyleTableSortTest
, StyleTableTest
, StyleListTest
, StyleListTest1
, StyleListTest2
, CompareLiteTest1
, CompareLiteTest2
, CompareLiteTest3
, CompareTextTest1
, CompareTextTest2
, CompareTextTest3
, CompareTest1
, CompareTest2
, CompareTest3
, CompareTest4
, CompareTest5
, CompareTest6
, CompareTest7
, CompareTest8
, CompareTest9
, CompareTest10
, CompareTest11
, WideCompareTextTest1
, WideCompareTextTest2
{$IfDef FPC}
, WideCompareTextTest3
{$EndIf FPC}
, WideCompareTextTest4
, WideCompareTextTest5
, WideCompareStrTest1
, WideCompareStrTest2
, ddTextParagraph
, ddTextSegment
, ddHyperlink
, ddPicture
, destPicture
, RTFtoEVDTest
, RTFtoEVDTest1
, RTFtoEVDTest2
, RTFtoEVDTest3
, RTFtoEVDTest4
, RTFtoEVDTest5
, RTFtoEVDTest6
, RTFtoEVDTest7
, RTFtoEVDTest8
, m2xltConvertBuffTest
, Cm2XLTANSI2UpperTest
, Cm2XLTAnsi2LowerTest
, Cm2XLTOem2AnsiTest
, Cm2XLTAnsi2OemTest
, Cm2XLTOem2UpperTest
, Cm2XLTOem2LowerTest
, Cm2XLTOemRus2EngTest
, Cm2XLTOemEng2RusTest
, Cm2XLTAnsiRus2EngTest
, Cm2XLTAnsiEng2RusTest
, Cm2XLTOem2SwapTest
, Cm2XLTAnsi2SwapTest
, Cm2XLTOem2SpecialTest
, m0LZOLib
, m3ZLibInflateStreamNewTest
, m3ZLibInflateStreamNewTest1
, m3ZLibInflateStreamNewTest2
, m3ZLibInflateStreamNewTest3
, m3ZLibDeflateStreamNewTest
, m3ZLibDeflateStreamNewTest1
, m3ZLibDeflateStreamNewTest2
, m3ZLibDeflateStreamNewTest3
, m3ZLibDeflateStreamNewTest4
, ODTtoEVDTest
, ODTtoEVDTest1
, ODTtoEVDTest2
, ODTtoEVDTest3
, ODTtoEVDTest4
, ddDocxReader
, DOCXtoEVDTest
, DOCXtoEVDTest1
, DOCXtoEVDTest2
, DOCXtoEVDTest3
, DOCXtoEVDTest4
, DOCXtoEVDTest5
, DOCXtoEVDTest6
, DOCXtoEVDTest7
, DOCXtoEVDTest8
, DOCXtoEVDTest9
, l3Bits
, l3BitArr
, ststrs // SysTools string routines
, IntToBinTest
, IntToBinTest1
, IntToBinZTest
, IntToBinZTest1
, Int64ToBinTest
, Int64ToBinTest1
, Int64ToBinZTest
, Int64ToBinZTest1
, l3SetBitTest1
, l3SetBitTest2
, l3SetBitTest3
, l3SetBitTest4
, l3SetBitWTest1
, l3SetBitWTest2
, l3SetBitWTest3
, l3SetBitWTest4
, l3SetBit64Test1
, l3SetBit64Test2
, l3SetBit64Test3
, l3SetBit64Test4
, SizeOfTl3NativeUIntTest
, SizeOfTl3NativeIntTest
, l3ClearBitTest1
, l3ClearBitTest2
, l3ClearBitTest3
, l3ClearBitTest4
, l3ClearBitWTest1
, l3ClearBitWTest2
, l3ClearBitWTest3
, l3ClearBitWTest4
, l3ClearBit64Test1
, l3ClearBit64Test2
, l3ClearBit64Test3
, l3ClearBit64Test4
, l3TestBitTest1
, l3TestBitTest2
, l3TestBitTest3
, l3TestBitTest4
, l3TestBitTest5
, l3TestBitTest6
, l3TestBitTest7
, l3TestBitTest8
, l3TestBit64Test1
, l3TestBit64Test2
, l3TestBit64Test3
, l3TestBit64Test4
, l3TestBit64Test5
, l3TestBit64Test6
, l3TestBit64Test7
, l3TestBit64Test8
, evTextFormatter
, evNSRWrt
, evSegmentsPairs
, ddNSRC_w
, evSimpleTextPainter
, evNSRCPlusWriter
, ddNSRCGenerator
, evBullet2TextFilter
, evEmptyTableEliminator
, NSRCtoNSRCNewTest
, NSRCtoNSRCNewTest1
, NSRCtoNSRCNewTest2
, NSRCtoNSRCNewTest3
, EVDtoNSRCTest
, EVDtoNSRCTest1
, EVDtoNSRCTest2
, EVDtoNSRCTest3
, EVDtoNSRCTest4
, EVDtoNSRCTest5
, EVDtoNSRCTest6
, EVDtoNSRCTest7
, EVDtoNSRCTest8
, EVDtoNSRCTest9
, EVDtoNSRCTest10
, EVDtoNSRCTest11
, EVDtoNSRCTest12
, EVDtoNSRCTest13
, EVDtoNSRC1251Test
, EVDtoNSRCKeepExistingTest
, EVDtoNSRCKeepExistingTest1
, EVDtoNSRCKeepExistingTest2
, EVDtoNSRCKeepExistingNotIsPlusPlusTest
, EVDtoNSRCWithoutConvertLapkiTest
{$If Defined(StringsHasCodePage)}
, CodePageTest1
, CodePageTest2
, CodePageTest3
, CodePageTest4
, CodePageTest5
, CodePageTest6
, CodePageTest7
, CodePageTest8
, CodePageTest9
, CodePageTest10
, CodePageTest11
, CodePageTest12
, CodePageTest13
, CodePageTest14
, CodePageTest15
, CodePageTest16
, CodePageTest17
, CodePageTest18
, CodePageTest19
, CodePageTest20
, CodePageTest21
, CodePageTest22
, CodePageTest23
, CodePageTest24
{$IfEnd}
, l3FieldSortRecListTest
, l3FieldSortRecListTest1
, l3FieldSortRecListTest2
, l3FieldSortRecListTest3
, ddDocument
, ddDocument_ResetToDefaultTest
, l3AutoreleasePool
, MakeTagTest1
, m3RootStreamManager
, m3NewRootStreamManager
, m3BaseStorage
, m3StoragePrim
, m3CommonStorage
, m3NewStoragePrim
, m3CustomNewStorage
, m3NewStorage
, m3ArchiveStorage
, m3stgmgr
, l3Core_Proxy
, l3StorageInterfaces_Proxy
, m3StorageInterfaces
, m3BuffStream
, m3FileStream
, ConstantStorageTest
, ReadModeStorageTest
, FullModeStorageTest
, FullModeVersionedStorageTest
, FullModeStackVersionedStorageTest
, FullModeStackVersionedStorageTest1
, ArchiStorageNewTest
, ArchiStorageNewTest1
, ArchiStorageVersionsNewTest
, l3ExceptionsLog
, tfwScriptingExceptions
, l3Except
, l3_String
, l3Filer
, l3StringEx
, Ansi186ToUnicodeTest
, AnsiToUnicodeTest
, RussianWinToUnicodeTest
, OemToUnicodeTest
, RussianDosToUnicodeTest
, EastEuropeToUnicodeTest
, WesternWinToUnicodeTest
, TatarToUnicodeTest
, TatarOEMToUnicodeTest
, OemLiteToUnicodeTest
, GreekToUnicodeTest
, TurkishToUnicodeTest
, UTF8ToUnicodeTest
, AnsiToUtf8Test
, RussianWinToUtf8Test
, OemToUtf8Test
, RussianDosToUtf8Test
, EastEuropeToUtf8Test
, WesternWinToUtf8Test
, TatarToUtf8Test
, TatarOEMToUtf8Test
, OemLiteToUtf8Test
, GreekToUtf8Test
, TurkishToUtf8Test
, Cardinal2Int64TestCase
, MOV32Test1
, MOV32Test2
, AND32Test1
{$IfDef Some64}
, MOV64Test1
, MOV64Test2
, AND64Test1
{$EndIf Some64}
, k2TagGen
, evdWriter
, evdReader
, graphics
, ExprDraw
, ExprMake
, TextToBMPTest
, l3ImageUtils
, TextToPNGTest
, FormulaToBMPTest
, FormulaToPNGTest
, MakeFormulasTest
, ddNSRC_r
, NSRCtoEVDTestNew
, NSRCtoEVDTestNew1
, NSRCtoEVDTestNew2
, NSRCtoEVDTestNew3
, NSRCtoEVDTestNew4
, ddSegmentScanner
, l3CanvasPrim
, l3Canvas
, l3SvgCanvas
, l3SvgCanvasEx
{$IfDef ExprUseSVG}
, TextToSVGTest
, FormulaToSVGTest
{$EndIf ExprUseSVG}
, evSimpleFormulaRender
, FormulaRenderTest
, FormulaRenderViaDllTest
, dd_rtfFields
, EVDtoRTFTest
, EVDtoRTFTest1
, nevPrintView
, l3Defaults
, l3Units
, nevTextParaRenderInfo
, evTextParaPainterEx
, EVDRenderToBitmapTest
, EVDRenderToBitmapTest1
, l3FontManager
, l3LineArray
, evTextParaTools
, evCustomTextSource
, evEditorWindowTextSource
, evTextSource
, evLoadDocumentManager
, evEditor
//, evFPCEditor
, nevTableRowRenderInfoEx
, l3WinControlCanvas
, l3CustomControlCanvas
, l3FormCanvas
{$If NOT Defined(Linux)}
, Windows
{$Else NOT Defined(Linux)}
// using l3LinWindows instead of Windows
, l3LinWindows
{$IfEnd} // NOT Defined(Linux)
{$If NOT Defined(Linux)}
, ActiveX
{$Else NOT Defined(Linux)}
// using l3LinActiveX instead of ActiveX
, l3LinActiveX
{$IfEnd} // NOT Defined(Linux)
, l3GraphicControlCanvas
, ddPictDetector
, l3IEBitmapContainer
, evExtFormat
, SynCommons
, eePDFCanvasHelper
{.$If NOT Defined(Linux)}
, EVDToPDFDirectRenderTest
{.$IfEnd} // NOT Defined(Linux)
{.$If NOT Defined(Linux)}
, EVDToPDFDirectRenderTest1
{.$IfEnd} // NOT Defined(Linux)
{.$If NOT Defined(Linux)}
//, EVDToPDFDirectRenderTest
//, EVDToPDFDirectRenderTest1
, EVDToPDFDirectRenderTest2
{.$IfEnd} // NOT Defined(Linux)
, EVDToPDFDirectRenderTest3
, EVDToPDFDirectRenderTest4
, EVDToPDFDirectRenderTest5
, EVDToPDFDirectRenderTest6
, EVDToPDFDirectRenderTest7
//, EVDToPDFDirectRenderTest8
// -- теста нет, потому что там EMF
//, EVDToPDFDirectRenderTest9
// -- теста нет, потому что там EMF
, EVDToPDFDirectRenderTest10
, EVDToPDFDirectRenderTest11
, EVDToPDFA1DirectRenderTest
, EVDToPDFA1DirectRenderTest1
{$IfDef FPC}
, fpparsettf
{$EndIf FPC}
{$IfDef FPC}
, fpvectorial
, wmfvectorialreader
{$EndIf FPC}
, EVDToPDFDirectRenderNoPackTest
, EVDToPDFDirectRenderNoPackTest1
, EVDToRTFRenderTest
, EVDToRTFRenderViaRenderEVDTest
, EVDToRTFRenderViaRenderRTFTest
, l3SharedConstStringsList
, l3ObjectStringList
, m3DBInterfaces
, m3PrimDB
, m3DB
, m3SimpleDB
, m3DBTools
, m3STSort
, m3ParaIndexBuilder
, m3DBDocument
, m3DBDocumentPart
, BaseUpdateTest
, StgIndexNewTest
, StgIndexNewTest1
, StgIndexNewTest2
, StgIndexNewTest3
, StgIndexNewTest4
, StgIndexNewTest5
, StgIndexNewTest6
, StgIndexNewTest7
, m3TempStream
, m4DB
, m3SearcherInterfaces
, m3IndexDumper
, m3IndexDumperJoin
, l3HandleList
, ddExtObjInserter
, m3RangedDocumentsList
, l3Enumerators
, l3Ranges
, Il3IntegerEnumerableFromRangeEnumerable
, m3IndexSearcherFilteredResult
, m3IndexSearcherEx
, m3IndexHashElementWithFilterModifiedAE
, m3IndexHashElementWithFilterModified
, m3IndexHashElementEnumeratorWithFilteredModified
, m3IdxCla
, m3IDRangeListPrim
, m3IDRangeList
, Il3IntegerEnumeratorFromRange
, Il3IntegerEnumeratorFromIl3RangeEnumerable
, m3IDRangeListTest
, m3IDRangeListTest1
, m3IDRangeListTest2
, m3IDRangeListTest3
, m3IDRangeListTest4
, m3IDRangeListTest5
, m3IDRangeListTest6
, m3IDRangeListTest7
, m3IDRangeListTest_1
, m3IDRangeListTest1_1
, m3IDRangeListTest2_1
, m3IDRangeListTest3_1
, m3IDRangeListTest4_1
, m3IDRangeListTest5_1
, m3IDRangeListTest6_1
, m3IDRangeListTest7_1
, m3IDRangeListWithNegativeTest1
, m3IDRangeListWithNegativeTest2
, m3IDRangeListWithNegativeTest3
, m3IDRangeListWithNegativeTest4
, m3IDRangeListWithNegativeTest5
, m3IDRangeListWithNegativeTest6
, m3IDRangeListRandomTest
, m3IDRangeListRandomTest1
, arUserDocInterfaces
, udDocIDRangeList
, m3IDRangeListSortedJoinTest
, m3IDRangeListSortedJoinTest1
, m3IDRangeListSortedJoinTest2
, m3IDRangeListSortedJoinTest3
, m3IDRangeListSortedJoinTest4
, m3IDRangeListSortedJoinTest5
, m3IDRangeListSortedJoinTest6
, nevFormatInfo
, m3IDRangeListSortedJoinTest7
, m3IDRangeListSortedJoinTest8
// {$Include l3EnumeratorSortedJoin_imp.pas}
, m3IDRangeListSortedJoinTest9
, m3IDRangeListSortedJoinTest10
, m3IDRangeListSortedJoinTest11
, m3IDRangeListSortedJoinTest12
, m3IDRangeListSortedJoinTest13
, m3IDRangeListSortedJoinTest14
, m3IDRangeListRemoveTest
, m3IDRangeListRemoveTest1
, m3IDRangeListRemoveTest2
, m3IDRangeListRemoveTest3
, m3IDRangeListRemoveTest4
, m3IDRangeListRemoveTest5
, m3IDRangeListRemoveTest6
, m3IDRangeListRemoveTest7
, m3IDRangeListRemoveTest8
, m3IDRangeListRemoveTest9
, m3IDRangeListRemoveTest10
, m3IDRangeListRemoveTest11
, m3IDRangeListRemoveTest12
, m3IDRangeListRemoveTest13
, m3IDRangeListRemoveTest14
, m3IDRangeListRemoveTest15
, m3IDRangeListRemoveTest16
, m3IDRangeListRemoveTest17
, m3IDRangeListRemoveTest18
, m3IDRangeListRemoveTest19
, m3IDRangeListRemoveTest20
, m3IDRangeListRemoveTest21
, m3IDRangeListRemoveTest22
, m3IDRangeListRemoveTest23
, m3EvdDocumentIndexBuilder
, m3EvdDocumentAttrsIndexBuilder
, m3EvdDocumentAttrsIndexBuilderForGroupOp
, m3GroupOpFilter
, m3AttrsFromIndexAdder
, m3DocumentIndexBuilder
, m3DocumentIndexBuilderEx
, m2MEMLib
, m3IndexHashElement
, m3IndexHashElementAE
, Im3IndexHashElementList
, m3AttrIndexElement
, Im3AttrIndexElementList
, m3AttrIndexDumper
, m3AttrIndexDumperJoin
//, Im3DirectAttrIndexElementEnumeratorWithFilteredModified
, Im3DirectAttrIndexElementEnumeratorSortedJoin
, Im3AttrIndexDumperList
, Im3AttrIndexDumperByTimeStampList
, vtFileSystem
, vtPanel
, vtDialogs
, m3ProxyIndexStream
, m3ProxyTempFileStream
, m3DocumentAttrIndexBuilder
, m3DBHelper
, m3AttrIndexInterfaces
, m3AttrIndexSearcher
, daDataProvider
, daQueryParams
, daDictQueryParams
, daAttrIndexInterfaces
, sdbDataProvider
, ddDictItemNameReplacer
, m3DirectQueryExecutorFactory
, l3ListenersManager
, PdaDocListAccessRecHolder
, m3QueryResultSetFromLongintList
, dtQueryProvider
, m3DocListQueryProvider
, m3AndQueryExecutor
, m3DocumentInfoExtractor
, m3TextQueryExecutor
, m3Morph
, m4SearchEx
, m3DateNumQueryExecutor
, evdVer
, dt_Types
//, m3STSort
, IntToStrAndConcatTest
, IntToStrAndConcatTest1
, IntToStrAndConcatTest2
, IntToStrAndConcatTest3
, m3LogByActionQueryExecutor
, m3DocInfo
, m3IDListQueryExecutor
, daIDListQueryParams
, m3DocListQueryExecutor
, evCustomMemo
{$IfDef FPC}
, ar_filters
{$EndIf FPC}
, sdbStorage
{.$IfDef FPC}
, sdbDictionary
, sdbDictDataAccess
{.$EndIf FPC}
, k2Core_Schema
, k2DocumentHeaderBuffer
, m3Exceptions
, k2Attributes
, ddDocStructBuildFilterPrim
, ddDocStruct
, evdStyles
, evParaTools
, evRange
, evCommentDecorator
, m3SplittedFileStream
, csAnnotationTask
, TcsAnnotationTaskTest
, csAutoClassTask
, csAutoExportTask
, csDocumentControlTask
, TcsAutoClassTaskTest
, TcsAutoExportTaskTest
, TcsDocumentControlTaskTest
, badIndexDumperTest
, StgIndexSearchNewTest
, l3IDList
, m3NewStorageStreamPrim
, m3VersionedStorageStream
, m3StorageBlock
, evSubPanel
, l3Variant
, m3RootStreamManagerPrimPrim
, k2Tags
, nevDocumentContainer
, m3TOCHandle
, l3IniFile
, TiffTopicToPDFRenderTest
, OvcCmd
, nevView
, daDocumentEnumList
, sdbExternalDocNumbers
, m3AttrIndexWriter
, m3AttrIndexWriterPackTest
, m3AttrIndexWriterPackTest1
, m3AttrIndexWriterPackTest2
, m3AttrIndexWriterPackRandomTest
, m3AttrIndexWriterPackRandomTest1
, m3LockedRegionsList
, m3AttrIndexSearcherTest
, m3AttrIndexSequentialTest
, m3IntegerToDocInfoMap
, m3IntegerToDocInfoMapSafe
, csClientMail
, m3DBCheckRunner
// - в тестах не используется но подключён для проверки компилируемости
, m3StorageIndexStream
;
implementation
(*
[*
TestCases.pas
│
├── 1. БАЗОВЫЙ СЛОЙ (L3)
│ ├── Память: l3MemUtils, l3AllocatedPointersTrace
│ ├── Потоки: l3Stream, l3StringStream, l3MemoryStream, l3TempFileStream
│ ├── Строки: l3String, l3StringEx, l3Chars, l3_String
│ ├── Списки: l3LongintList, l3IDList, l3ObjectStringList
│ ├── Биты: l3Bits, l3BitArr, l3SetBitTest*, l3TestBitTest*
│ └── Сравнение: CompareTest*, CompareLiteTest*, CompareTextTest*
│
├── 2. КОДИРОВКИ И UNICODE
│ ├── AnsiToUnicode, RussianWinToUnicode, OemToUnicode
│ ├── UTF8ToUnicode, AnsiToUtf8, RussianWinToUtf8
│ ├── CodePageTest1-24
│ └── WideCompareTextTest*, WideCompareStrTest*
│
├── 3. ХРАНИЛИЩА И ИНДЕКСЫ (m3)
│ ├── Индексы атрибутов: m3AttrIndexWriterPackTest*, m3AttrIndexSearcherTest
│ ├── Диапазоны: m3IDRangeListTest*, m3IDRangeListSortedJoinTest*
│ ├── Storage: ConstantStorageTest, FullModeStorageTest, ArchiStorageNewTest
│ └── Searcher: m3AttrIndexSearcher, m3DocInfo, m3DBTools
│
├── 4. ДОКУМЕНТЫ (EVD, K2)
│ ├── Чтение/запись: evdReader, evdWriter, evdNativeWriter, evdNativeReader
│ ├── Преобразования: EVDtoEVDTest*, EVDtoEVDBinTest
│ ├── Стили: StyleTableTest, StyleListTest, evdStyleContainer
│ └── Структура: ddDocument, ddTextParagraph, ddHyperlink, ddPicture
│
├── 5. ФОРМАТЫ ДОКУМЕНТОВ
│ ├── RTF: RTFtoEVDTest*, EVDtoRTFTest, ddRTFWriter, ddRTFReader
│ ├── DOCX: DOCXtoEVDTest*, ddDocxReader
│ ├── ODT: ODTtoEVDTest*, ddODTReader
│ └── NSRC: NSRCtoEVDTestNew*, EVDtoNSRCTest*, ddNSRC_w, ddNSRCGenerator
│
├── 6. ЭКСПОРТ И РЕНДЕРИНГ
│ ├── PDF: EVDToPDFDirectRenderTest*, EVDToPDFA1DirectRenderTest
│ ├── RTF: EVDToRTFRenderTest, EVDToRTFRenderViaRenderEVDTest
│ ├── SVG: TextToSVGTest, FormulaToSVGTest, l3SvgCanvas
│ ├── BMP/PNG: TextToBMPTest, FormulaToBMPTest, EVDRenderToBitmapTest
│ └── Формулы: FormulaRenderTest, FormulaRenderViaDllTest, evSimpleFormulaRender
│
├── 7. ГРУППОВЫЕ ОПЕРАЦИИ
│ ├── GroupOperationTest*, m3GroupOpFilter
│ ├── m3EvdDocumentAttrsIndexBuilderForGroupOp
│ └── m3AttrsFromIndexAdder
│
├── 8. СКРИПТЫ (tfw)
│ ├── vcmInsiderTest, CustomInsiderScripter
│ ├── tfwTypeModifier, tfwScriptingInterfaces
│ └── DailyAutoTestFPC (скриптовые тесты)
│
├── 9. КРОССПЛАТФОРМЕННОСТЬ
│ ├── {$IFDEF UNIX} cwstring {$ENDIF}
│ ├── l3LinWindows вместо Windows
│ ├── l3LinActiveX вместо ActiveX
│ └── fpparsettf, fpvectorial для Linux
│
└── 10. GENERICS (FPC)
├── FGL, tcGeneric1, GenericTestCase1-11
└── GenericTestCaseEx1-11
*]
*)
end.
m3DBHelper
{$IfDef FPC}{$CodePage cp1251}{$EndIf FPC}
unit m3DBHelper;
// --------------------------------------------------------------------------
// Родители: "Searcher" <<Unit>> MUID: (5B02C2CD0274) :: "m3" <<Library>> MUID: (548712F60101) :: "Shared Delphi Low Level" <<Project>> MUID: (4ABCC25A0322)
// --------------------------------------------------------------------------
// Модуль: "w:\common\components\rtl\Garant\m3\m3DBHelper.pas" GeneratorVersion: 1.0.0.883901
// Стереотип: "<<SimpleClass>>"
// Элемент модели: "Tm3DBHelper" MUID: (5B4782B40258)
// --------------------------------------------------------------------------
//#UC START# *5B4782B40258beforeDefines*
//#UC END# *5B4782B40258beforeDefines*
{$Include m3Define.inc}
interface
uses
l3IntfUses
, l3CProtoObject
, m3SearcherInterfaces
, SysUtils
, l3Filer
, l3StringList
, l3Core
, l3CoreInterfaces
//#UC START# *5B4782B40258intf_uses*
;
{$IfDef Archi}
{$Define NoBackCopy}
{$Else Archi}
{$IfDef m3DBCheck}
{$Define NoBackCopy}
{$Else m3DBCheck}
{$IfDef nsTest}
{$Define NoBackCopy}
{$Else nsTest}
{.$Define NoBackCopy}
{$EndIf nsTest}
{$EndIf m3DBCheck}
{$EndIf Archi}
var g_NoBackCopy : Boolean =
// - https://mdp.garant.ru/pages/viewpage.action?pageId=902335598
{$IfDef NoBackCopy}
true
{$Else NoBackCopy}
false
{$EndIf NoBackCopy}
//#UC END# *5B4782B40258intf_uses*
;
type
//#UC START# *5B4782B40258ci*
//#UC END# *5B4782B40258ci*
Tm3DBHelper = class(Tl3CProtoObject, Im3DBHelper)
private
f_BaseName: TFileName;
f_FlagName: TFileName;
{$If Defined(Never)}
f_FlagFiler: Tl3CustomFiler;
{$IfEnd} // Defined(Never)
f_IndexDeltaFilesForPurge: Tl3StringList;
f_FlagHandle: Tl3CoreHandle;
protected
procedure CheckIndexDeltaFiles;
procedure SaveFiles(const aFileName: AnsiString;
const aFiles: Im3FilesEnumerable;
const anExcludeFiles: Im3FilesEnumerable);
function LoadFiles(const aFileName: AnsiString;
var aFiles: Tl3StringList): Boolean;
procedure SaveIndexDeltaFilesForPurge;
class function SafeDeleteStorageFile(const aFileName: AnsiString;
var aNotDeleted: Tl3StringList): Boolean;
class function SafeDeleteStorageFiles(const aFiles: Im3FilesEnumerator;
var aNotDeleted: Tl3StringList): Boolean;
class function AddToList(var aList: Tl3StringList;
const aName: AnsiString): Boolean;
{* Добавляет значение в список без дубликатов }
function DeleteIndexPrim: Boolean;
function NewIndexDeltaNamePrim(const aFiles: Im3FilesEnumerable;
const anExt: TFileName): Il3CString;
function GetIndexDeltasFiles: Im3FilesEnumerable;
{* Файлы дельты индекса }
function NewIndexDeltaName(const aFiles: Im3FilesEnumerable): Il3CString;
procedure AddNewIndexDeltaName(var aName: Il3CString;
var aFiles: Im3FilesEnumerable;
aNeedRenameToCanonical: Boolean = True);
function LockDeltas(const aFiles: Im3FilesEnumerable): Boolean;
{* Пытается захватить индексы. Если они уже захвачены, то возвращает false }
procedure UnlockDeltas;
{* Освобождает захваченные индексы }
function DeleteIndexDeltas(var aFiles: Im3FilesEnumerable;
aKeepNewDeltas: Boolean): Boolean;
function IndexName: Il3CString;
function GetIndexForPurgeFiles: Im3FilesEnumerable;
{* "Провисшие" файлы для удаления }
function NewIndexName: Il3CString;
procedure SetNewIndexName(var aName: Il3CString);
function DeleteIndex: Boolean;
procedure PurgeIndexDeltas;
function DeleteAllIndexDeltas: Boolean;
function GetAllIndexFiles: Im3FilesEnumerable;
{* Все файлы индекса для поиска или объединения }
function GetIndexMainFiles: Im3FilesEnumerable;
{* Файлы основной части индекса (то что раньше было IndexName) }
function Get_BaseName: AnsiString;
function TryLockDeltas(const aFiles: Im3FilesEnumerable): Boolean;
{* Пытается захватить индексы. Может это делать в цикле, с таймаутом }
procedure Cleanup; override;
{* Функция очистки полей объекта. }
procedure BeforeFree; override;
{* функция, вызываемая при каждом уменьшении счетчика ссылок на 1. Вернув false может запретить уничтожение объекта. }
procedure BeforeRelease; override;
public
constructor Create(const aBaseName: AnsiString); reintroduce;
class function Make(const aBaseName: AnsiString): Im3DBHelper; reintroduce;
class function WStrToEnumerable(const aStr: Tl3WString): Im3FilesEnumerable;
{* Преобразует строку к списку }
{$If NOT Defined(l3NoSRT)}
function SetRefTo(var thePlace: Tm3DBHelper): Boolean; overload; {$If Defined(l3HasInl)}inline;{$IfEnd}
{$IfEnd} // NOT Defined(l3NoSRT)
//#UC START# *5B4782B40258publ*
//#UC END# *5B4782B40258publ*
end;//Tm3DBHelper
var g_WeAreLocker: Integer = 0;
{* - затычка, но пока так }
implementation
uses
l3ImplUses
{$If NOT Defined(NoScripts)}
, tfwReadonlyPropertyLike
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwValueTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwScriptingInterfaces
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwClassCreator
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwWordInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwClassBinaryOperator
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwClassMapper
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwClassBinaryPredicate
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwClassProcedure
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwClassPredicate
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, tfwAxiomaticsResNameGetter
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, TtfwTypeRegistrator_Proxy
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
, TtfwClassRef_Proxy
{$IfEnd} // NOT Defined(NoScripts)
, l3Interfaces
, l3String
{$If NOT Defined(NoScripts)}
, tfwTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
, l3StringsEnumerator
{$If NOT Defined(NoScripts)}
, tfwRegisterableWordPrim
{$IfEnd} // NOT Defined(NoScripts)
//#UC START# *5B4782B40258impl_uses*
{$IFDEF Linux}
, baseunix
{$EndIF Linux}
{$IFDEF Linux}
, l3LinWindows
{$ELSE}
, Windows
{$ENDIF}
//, SysUtils
, StrUtils
, Math
, DateUtils
, l3Types
, l3SharedConstString
//, l3String
//, l3Filer
, l3SysUtils
, l3FileUtils
, l3MinMax
, l3Date
, l3Base
, m3StgMgr
//, m4DB
, m3SplittedFileStream
, m3StorageHolderList
, m3AttrIndexSearcher
, m3IndexDumperJoin
, m3AttrIndexDumperJoin
;
const
cIndexExt = '.idx';
cIndexRefExt = '.index';
cIndexDeltaExt = '.idxdelta';
cIndexDeltasExt = '.idxdeltas';
cIndexDeltasForPurgeExt = '.idxdeltaspurge';
cTimeOut = 3000
//#UC END# *5B4782B40258impl_uses*
;
type
Tm3DBHelperClass = class of Tm3DBHelper;
{* Ссылка на класс Tm3DBHelper }
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperClassCreate = TtfwClassCreator;
{* Слово скрипта m3DBHelperClass:Create }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperClassMake = TtfwClassBinaryOperator;
{* Слово скрипта m3DBHelperClass:Make }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperClassWStrToEnumerable = TtfwClassBinaryOperator;
{* Слово скрипта m3DBHelperClass:WStrToEnumerable
Преобразует строку к списку. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperBaseName = TtfwReadonlyPropertyLike;
{* Слово скрипта m3DBHelper:BaseName }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperCreate = TtfwClassCreator;
{* Слово скрипта m3DBHelper:Create }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperMake = TtfwClassBinaryOperator;
{* Слово скрипта m3DBHelper:Make }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperWStrToEnumerable = TtfwClassBinaryOperator;
{* Слово скрипта m3DBHelper:WStrToEnumerable
Преобразует строку к списку. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetIndexDeltasFiles = TtfwClassMapper;
{* Слово скрипта m3DBHelper:GetIndexDeltasFiles
Файлы дельты индекса. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperNewIndexDeltaName = TtfwClassBinaryOperator;
{* Слово скрипта m3DBHelper:NewIndexDeltaName }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperLockDeltas = TtfwClassBinaryPredicate;
{* Слово скрипта m3DBHelper:LockDeltas
Пытается захватить индексы. Если они уже захвачены, то возвращает false. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperUnlockDeltas = TtfwClassProcedure;
{* Слово скрипта m3DBHelper:UnlockDeltas
Освобождает захваченные индексы. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperIndexName = TtfwClassMapper;
{* Слово скрипта m3DBHelper:IndexName }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetIndexForPurgeFiles = TtfwClassMapper;
{* Слово скрипта m3DBHelper:GetIndexForPurgeFiles
"Провисшие" файлы для удаления. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperNewIndexName = TtfwClassMapper;
{* Слово скрипта m3DBHelper:NewIndexName }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperDeleteIndex = TtfwClassPredicate;
{* Слово скрипта m3DBHelper:DeleteIndex }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperPurgeIndexDeltas = TtfwClassProcedure;
{* Слово скрипта m3DBHelper:PurgeIndexDeltas }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperDeleteAllIndexDeltas = TtfwClassPredicate;
{* Слово скрипта m3DBHelper:DeleteAllIndexDeltas }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetAllIndexFiles = TtfwClassMapper;
{* Слово скрипта m3DBHelper:GetAllIndexFiles
Все файлы индекса для поиска или объединения. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetIndexMainFiles = TtfwClassMapper;
{* Слово скрипта m3DBHelper:GetIndexMainFiles
Файлы основной части индекса (то что раньше было IndexName). }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperTryLockDeltas = TtfwClassBinaryPredicate;
{* Слово скрипта m3DBHelper:TryLockDeltas
Пытается захватить индексы. Может это делать в цикле, с таймаутом. }
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TTm3DBHelperKeywordsPackResNameGetter = {final} class(TtfwAxiomaticsResNameGetter)
{* Регистрация скриптованой аксиоматики }
public
class function ResName: AnsiString; override;
end;//TTm3DBHelperKeywordsPackResNameGetter
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperClassCreate_Tm3DBHelper_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TypeInfo(Tm3DBHelper));
end;//TkwTm3DBHelperClassCreate_Tm3DBHelper_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperClassCreate_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TtfwValueTypes.MakeClassRef(TypeInfo(Tm3DBHelper))), TtfwParamInfo_C('aBaseName', TtfwTypeInfo.MakeString)]);
end;//TkwTm3DBHelperClassCreate_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperClassCreate_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelperClass;
var l_aBaseName: AnsiString;
begin
try
l_aSelf := Tm3DBHelperClass(aCtx.rEngine.Pop.AsClassOf(Tm3DBHelper));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelperClass : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aBaseName := aCtx.rEngine.PopDelphiString;
except
on E: Exception do
begin
aCtx.GetParamError('aBaseName: AnsiString : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushObj(l_aSelf.Create(l_aBaseName), TypeInfo(Tm3DBHelper));
end;//TkwTm3DBHelperClassCreate_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperClassMake_Im3DBHelper_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TypeInfo(Im3DBHelper));
end;//TkwTm3DBHelperClassMake_Im3DBHelper_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperClassMake_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TtfwValueTypes.MakeClassRef(TypeInfo(Tm3DBHelper))), TtfwParamInfo_C('aBaseName', TtfwTypeInfo.MakeString)]);
end;//TkwTm3DBHelperClassMake_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperClassMake_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelperClass;
var l_aBaseName: AnsiString;
begin
try
l_aSelf := Tm3DBHelperClass(aCtx.rEngine.Pop.AsClassOf(Tm3DBHelper));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelperClass : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aBaseName := aCtx.rEngine.PopDelphiString;
except
on E: Exception do
begin
aCtx.GetParamError('aBaseName: AnsiString : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(l_aSelf.Make(l_aBaseName), TypeInfo(Im3DBHelper));
end;//TkwTm3DBHelperClassMake_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperClassWStrToEnumerable_Im3FilesEnumerable_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperClassWStrToEnumerable_Im3FilesEnumerable_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperClassWStrToEnumerable_Documentation: AnsiString;
begin
Result := 'Преобразует строку к списку.';
end;//TkwTm3DBHelperClassWStrToEnumerable_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperClassWStrToEnumerable_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TtfwValueTypes.MakeClassRef(TypeInfo(Tm3DBHelper))), TtfwParamInfo_C('aStr', TtfwTypeInfo.MakeString)]);
end;//TkwTm3DBHelperClassWStrToEnumerable_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperClassWStrToEnumerable_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelperClass;
var l_aStr: Tl3WString;
begin
try
l_aSelf := Tm3DBHelperClass(aCtx.rEngine.Pop.AsClassOf(Tm3DBHelper));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelperClass : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aStr := l3PCharLen(aCtx.rEngine.PopString);
except
on E: Exception do
begin
aCtx.GetParamError('aStr: Tl3WString : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(l_aSelf.WStrToEnumerable(l_aStr), TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperClassWStrToEnumerable_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function Tm3DBHelperClassKeywordsPack_Tm3DBHelperClass_SelfTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.MakeClassRef(TypeInfo(Tm3DBHelper));
end;//Tm3DBHelperClassKeywordsPack_Tm3DBHelperClass_SelfTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperBaseName_ImplBaseName(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): AnsiString;
begin
if (aSelf = nil) then
begin
Result := '';
Exit;
end;
Result := aSelf.Get_BaseName;
end;//TkwTm3DBHelperBaseName_ImplBaseName
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperBaseName_AnsiString_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TtfwTypeInfo.MakeString);
end;//TkwTm3DBHelperBaseName_AnsiString_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperBaseName_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushString(TkwTm3DBHelperBaseName_ImplBaseName(aCtx, l_aSelf));
end;//TkwTm3DBHelperBaseName_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperCreate_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aBaseName', TtfwTypeInfo.MakeString)]);
end;//TkwTm3DBHelperCreate_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperCreate_DoIt(const aCtx: TtfwContext);
var l_aBaseName: AnsiString;
begin
try
l_aBaseName := aCtx.rEngine.PopDelphiString;
except
on E: Exception do
begin
aCtx.GetParamError('aBaseName: AnsiString : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushObj(Tm3DBHelper.Create(l_aBaseName), TypeInfo(Tm3DBHelper));
end;//TkwTm3DBHelperCreate_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperMake_Im3DBHelper_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TypeInfo(Im3DBHelper));
end;//TkwTm3DBHelperMake_Im3DBHelper_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperMake_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TtfwValueTypes.MakeClassRef(TypeInfo(Tm3DBHelper))), TtfwParamInfo_C('aBaseName', TtfwTypeInfo.MakeString)]);
end;//TkwTm3DBHelperMake_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperMake_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelperClass;
var l_aBaseName: AnsiString;
begin
try
l_aSelf := Tm3DBHelperClass(aCtx.rEngine.Pop.AsClassOf(Tm3DBHelper));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelperClass : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aBaseName := aCtx.rEngine.PopDelphiString;
except
on E: Exception do
begin
aCtx.GetParamError('aBaseName: AnsiString : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(l_aSelf.Make(l_aBaseName), TypeInfo(Im3DBHelper));
end;//TkwTm3DBHelperMake_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperWStrToEnumerable_Im3FilesEnumerable_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperWStrToEnumerable_Im3FilesEnumerable_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperWStrToEnumerable_Documentation: AnsiString;
begin
Result := 'Преобразует строку к списку.';
end;//TkwTm3DBHelperWStrToEnumerable_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperWStrToEnumerable_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TtfwValueTypes.MakeClassRef(TypeInfo(Tm3DBHelper))), TtfwParamInfo_C('aStr', TtfwTypeInfo.MakeString)]);
end;//TkwTm3DBHelperWStrToEnumerable_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperWStrToEnumerable_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelperClass;
var l_aStr: Tl3WString;
begin
try
l_aSelf := Tm3DBHelperClass(aCtx.rEngine.Pop.AsClassOf(Tm3DBHelper));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelperClass : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aStr := l3PCharLen(aCtx.rEngine.PopString);
except
on E: Exception do
begin
aCtx.GetParamError('aStr: Tl3WString : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(l_aSelf.WStrToEnumerable(l_aStr), TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperWStrToEnumerable_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexDeltasFiles_ImplGetIndexDeltasFiles(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Im3FilesEnumerable;
begin
Result := aSelf.GetIndexDeltasFiles;
end;//TkwTm3DBHelperGetIndexDeltasFiles_ImplGetIndexDeltasFiles
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexDeltasFiles_Im3FilesEnumerable_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetIndexDeltasFiles_Im3FilesEnumerable_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexDeltasFiles_Documentation: AnsiString;
begin
Result := 'Файлы дельты индекса.';
end;//TkwTm3DBHelperGetIndexDeltasFiles_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperGetIndexDeltasFiles_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(TkwTm3DBHelperGetIndexDeltasFiles_ImplGetIndexDeltasFiles(aCtx, l_aSelf), TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetIndexDeltasFiles_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperNewIndexDeltaName_ImplNewIndexDeltaName(const aCtx: TtfwContext;
aSelf: Tm3DBHelper;
const aFiles: Im3FilesEnumerable): Il3CString;
begin
Result := aSelf.NewIndexDeltaName(aFiles);
end;//TkwTm3DBHelperNewIndexDeltaName_ImplNewIndexDeltaName
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperNewIndexDeltaName_Il3CString_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TtfwTypeInfo.MakeString);
end;//TkwTm3DBHelperNewIndexDeltaName_Il3CString_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperNewIndexDeltaName_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TypeInfo(Tm3DBHelper)), TtfwParamInfo_C('aFiles', TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable)))]);
end;//TkwTm3DBHelperNewIndexDeltaName_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperNewIndexDeltaName_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
var l_aFiles: Im3FilesEnumerable;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aFiles := Im3FilesEnumerable(aCtx.rEngine.Pop.AsIntf(TypeInfo(Im3FilesEnumerable)));
except
on E: Exception do
begin
aCtx.GetParamError('aFiles: Im3FilesEnumerable : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushString(TkwTm3DBHelperNewIndexDeltaName_ImplNewIndexDeltaName(aCtx, l_aSelf, l_aFiles));
end;//TkwTm3DBHelperNewIndexDeltaName_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperLockDeltas_ImplLockDeltas(const aCtx: TtfwContext;
aSelf: Tm3DBHelper;
const aFiles: Im3FilesEnumerable): Boolean;
begin
Result := aSelf.LockDeltas(aFiles);
end;//TkwTm3DBHelperLockDeltas_ImplLockDeltas
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperLockDeltas_Documentation: AnsiString;
begin
Result := 'Пытается захватить индексы. Если они уже захвачены, то возвращает false.';
end;//TkwTm3DBHelperLockDeltas_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperLockDeltas_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TypeInfo(Tm3DBHelper)), TtfwParamInfo_C('aFiles', TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable)))]);
end;//TkwTm3DBHelperLockDeltas_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperLockDeltas_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
var l_aFiles: Im3FilesEnumerable;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aFiles := Im3FilesEnumerable(aCtx.rEngine.Pop.AsIntf(TypeInfo(Im3FilesEnumerable)));
except
on E: Exception do
begin
aCtx.GetParamError('aFiles: Im3FilesEnumerable : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushBool(TkwTm3DBHelperLockDeltas_ImplLockDeltas(aCtx, l_aSelf, l_aFiles));
end;//TkwTm3DBHelperLockDeltas_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperUnlockDeltas_ImplUnlockDeltas(const aCtx: TtfwContext;
aSelf: Tm3DBHelper);
begin
aSelf.UnlockDeltas;
end;//TkwTm3DBHelperUnlockDeltas_ImplUnlockDeltas
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperUnlockDeltas_Documentation: AnsiString;
begin
Result := 'Освобождает захваченные индексы.';
end;//TkwTm3DBHelperUnlockDeltas_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperUnlockDeltas_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
TkwTm3DBHelperUnlockDeltas_ImplUnlockDeltas(aCtx, l_aSelf);
end;//TkwTm3DBHelperUnlockDeltas_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperIndexName_ImplIndexName(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Il3CString;
begin
Result := aSelf.IndexName;
end;//TkwTm3DBHelperIndexName_ImplIndexName
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperIndexName_Il3CString_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TtfwTypeInfo.MakeString);
end;//TkwTm3DBHelperIndexName_Il3CString_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperIndexName_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushString(TkwTm3DBHelperIndexName_ImplIndexName(aCtx, l_aSelf));
end;//TkwTm3DBHelperIndexName_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexForPurgeFiles_ImplGetIndexForPurgeFiles(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Im3FilesEnumerable;
begin
Result := aSelf.GetIndexForPurgeFiles;
end;//TkwTm3DBHelperGetIndexForPurgeFiles_ImplGetIndexForPurgeFiles
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexForPurgeFiles_Im3FilesEnumerable_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetIndexForPurgeFiles_Im3FilesEnumerable_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexForPurgeFiles_Documentation: AnsiString;
begin
Result := '"Провисшие" файлы для удаления.';
end;//TkwTm3DBHelperGetIndexForPurgeFiles_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperGetIndexForPurgeFiles_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(TkwTm3DBHelperGetIndexForPurgeFiles_ImplGetIndexForPurgeFiles(aCtx, l_aSelf), TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetIndexForPurgeFiles_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperNewIndexName_ImplNewIndexName(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Il3CString;
begin
Result := aSelf.NewIndexName;
end;//TkwTm3DBHelperNewIndexName_ImplNewIndexName
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperNewIndexName_Il3CString_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TtfwTypeInfo.MakeString);
end;//TkwTm3DBHelperNewIndexName_Il3CString_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperNewIndexName_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushString(TkwTm3DBHelperNewIndexName_ImplNewIndexName(aCtx, l_aSelf));
end;//TkwTm3DBHelperNewIndexName_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperDeleteIndex_ImplDeleteIndex(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Boolean;
begin
Result := aSelf.DeleteIndex;
end;//TkwTm3DBHelperDeleteIndex_ImplDeleteIndex
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperDeleteIndex_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushBool(TkwTm3DBHelperDeleteIndex_ImplDeleteIndex(aCtx, l_aSelf));
end;//TkwTm3DBHelperDeleteIndex_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperPurgeIndexDeltas_ImplPurgeIndexDeltas(const aCtx: TtfwContext;
aSelf: Tm3DBHelper);
begin
aSelf.PurgeIndexDeltas;
end;//TkwTm3DBHelperPurgeIndexDeltas_ImplPurgeIndexDeltas
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperPurgeIndexDeltas_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
TkwTm3DBHelperPurgeIndexDeltas_ImplPurgeIndexDeltas(aCtx, l_aSelf);
end;//TkwTm3DBHelperPurgeIndexDeltas_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperDeleteAllIndexDeltas_ImplDeleteAllIndexDeltas(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Boolean;
begin
Result := aSelf.DeleteAllIndexDeltas;
end;//TkwTm3DBHelperDeleteAllIndexDeltas_ImplDeleteAllIndexDeltas
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperDeleteAllIndexDeltas_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushBool(TkwTm3DBHelperDeleteAllIndexDeltas_ImplDeleteAllIndexDeltas(aCtx, l_aSelf));
end;//TkwTm3DBHelperDeleteAllIndexDeltas_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetAllIndexFiles_ImplGetAllIndexFiles(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Im3FilesEnumerable;
begin
Result := aSelf.GetAllIndexFiles;
end;//TkwTm3DBHelperGetAllIndexFiles_ImplGetAllIndexFiles
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetAllIndexFiles_Im3FilesEnumerable_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetAllIndexFiles_Im3FilesEnumerable_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetAllIndexFiles_Documentation: AnsiString;
begin
Result := 'Все файлы индекса для поиска или объединения.';
end;//TkwTm3DBHelperGetAllIndexFiles_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperGetAllIndexFiles_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(TkwTm3DBHelperGetAllIndexFiles_ImplGetAllIndexFiles(aCtx, l_aSelf), TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetAllIndexFiles_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexMainFiles_ImplGetIndexMainFiles(const aCtx: TtfwContext;
aSelf: Tm3DBHelper): Im3FilesEnumerable;
begin
Result := aSelf.GetIndexMainFiles;
end;//TkwTm3DBHelperGetIndexMainFiles_ImplGetIndexMainFiles
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexMainFiles_Im3FilesEnumerable_ResultTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetIndexMainFiles_Im3FilesEnumerable_ResultTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperGetIndexMainFiles_Documentation: AnsiString;
begin
Result := 'Файлы основной части индекса (то что раньше было IndexName).';
end;//TkwTm3DBHelperGetIndexMainFiles_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperGetIndexMainFiles_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushIntf(TkwTm3DBHelperGetIndexMainFiles_ImplGetIndexMainFiles(aCtx, l_aSelf), TypeInfo(Im3FilesEnumerable));
end;//TkwTm3DBHelperGetIndexMainFiles_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperTryLockDeltas_ImplTryLockDeltas(const aCtx: TtfwContext;
aSelf: Tm3DBHelper;
const aFiles: Im3FilesEnumerable): Boolean;
begin
Result := aSelf.TryLockDeltas(aFiles);
end;//TkwTm3DBHelperTryLockDeltas_ImplTryLockDeltas
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperTryLockDeltas_Documentation: AnsiString;
begin
Result := 'Пытается захватить индексы. Может это делать в цикле, с таймаутом.';
end;//TkwTm3DBHelperTryLockDeltas_Documentation
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function TkwTm3DBHelperTryLockDeltas_ParamsTypes: PTypeInfoArray;
begin
Result := TtfwWord.OpenTypesToTypes([TtfwParamInfo_C('aSelf', TypeInfo(Tm3DBHelper)), TtfwParamInfo_C('aFiles', TtfwValueTypes.MakeTypedef('Im3FilesEnumerable', TypeInfo(Im3FilesEnumerable)))]);
end;//TkwTm3DBHelperTryLockDeltas_ParamsTypes
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
procedure TkwTm3DBHelperTryLockDeltas_DoIt(const aCtx: TtfwContext);
var l_aSelf: Tm3DBHelper;
var l_aFiles: Im3FilesEnumerable;
begin
try
l_aSelf := Tm3DBHelper(aCtx.rEngine.Pop.AsObject(TypeInfo(Tm3DBHelper)));
except
on E: Exception do
begin
aCtx.GetParamError('aSelf: Tm3DBHelper : ', E);
Exit;
end;//on E: Exception
end;//try..except
try
l_aFiles := Im3FilesEnumerable(aCtx.rEngine.Pop.AsIntf(TypeInfo(Im3FilesEnumerable)));
except
on E: Exception do
begin
aCtx.GetParamError('aFiles: Im3FilesEnumerable : ', E);
Exit;
end;//on E: Exception
end;//try..except
aCtx.rEngine.PushBool(TkwTm3DBHelperTryLockDeltas_ImplTryLockDeltas(aCtx, l_aSelf, l_aFiles));
end;//TkwTm3DBHelperTryLockDeltas_DoIt
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
function Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo: TtfwValueTypes;
begin
Result := TtfwValueTypes.Make(TypeInfo(Tm3DBHelper));
end;//Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo
{$IfEnd} // NOT Defined(NoScripts)
constructor Tm3DBHelper.Create(const aBaseName: AnsiString);
//#UC START# *5B4782E301CB_5B4782B40258_var*
//#UC END# *5B4782E301CB_5B4782B40258_var*
begin
//#UC START# *5B4782E301CB_5B4782B40258_impl*
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
f_BaseName := aBaseName;
f_BaseName := Tm3SplittedFileStream.NormalizeFileName(f_BaseName);
f_BaseName := ChangeFileExt(f_BaseName, '');
inherited Create;
//#UC END# *5B4782E301CB_5B4782B40258_impl*
end;//Tm3DBHelper.Create
class function Tm3DBHelper.Make(const aBaseName: AnsiString): Im3DBHelper;
var
l_Inst : Tm3DBHelper;
begin
l_Inst := Create(aBaseName);
try
Result := l_Inst;
finally
l_Inst.Free;
end;//try..finally
end;//Tm3DBHelper.Make
procedure Tm3DBHelper.CheckIndexDeltaFiles;
//#UC START# *5B4786110237_5B4782B40258_var*
//var
//l_IndexName : String;
//l_Name : String;
//l_Index : Integer;
//l_T1, l_T2 : TDateTime;
//l_WasDelete : Boolean;
//#UC END# *5B4786110237_5B4782B40258_var*
begin
//#UC START# *5B4786110237_5B4782B40258_impl*
//if (f_IndexDeltaFiles = nil) then
begin
LoadFiles(cIndexDeltasForPurgeExt, f_IndexDeltaFilesForPurge);
//if (f_IndexDeltaFiles = nil) then
// f_IndexDeltaFiles := Tl3StringList.Create;
//if LoadFiles(cIndexDeltasExt, f_IndexDeltaFiles) then
//begin
(* while true do
begin
if (l_Index = 0) then
l_Name := f_BaseName + cIndexDeltaExt
else
l_Name := f_BaseName + cIndexDeltaExt + IntToStr(l_Index);
if not Tm3StorageManager.StorageFileExists(l_Name) then
begin
l_IndexName := l_Name;
break;
end;//not Tm3StorageManager.StorageFileExists(l_Name)
Inc(l_Index);
end;//while true
f_NewIndexDeltaName := l_IndexName;
l_WasDelete := false;
if not f_IndexDeltaFiles.Empty then
begin
l_IndexName := IndexName;
if Tm3StorageManager.StorageFileExists(l_IndexName) then
begin
l_T1 := Tm3StorageManager.StorageFileDateTime(l_IndexName);
if not SameValue(l_T1, NullDate) then
begin
l_Index := 0;
while (l_Index < f_IndexDeltaFiles.Count) do
begin
l_IndexName := f_IndexDeltaFiles.Items[l_Index].AsString;
l_T2 := Tm3StorageManager.StorageFileDateTime(l_IndexName);
if not SameValue(l_T2, NullDate) then
begin
if ((DaysBetween(l_T1, l_T2) > 0) AND (CompareValue(l_T1, l_T2) > 0)) then
begin
f_IndexDeltaFiles.Delete(l_Index);
AddToList(f_IndexDeltaFilesForPurge, l_IndexName);
l_WasDelete := true;
continue;
end;//DaysBetween..
end;//not SameValue(l_T2, NullDate)
Inc(l_Index);
end;//while (l_Index < f_IndexDeltaFiles.Count)
end;//not SameValue(l_T1, NullDate)
end;//Tm3StorageManager.StorageFileExists(l_IndexName)
end;//not f_IndexDeltaFiles.Empty
if l_WasDelete then
begin
SaveIndexDeltaFilesForPurge;
SaveIndexDeltaFiles;
end;//l_WasDelete*)
//end//LoadFiles(cIndexDeltasExt, f_IndexDeltaFiles, l_Index)
//else
//begin
// - эту ветку пока НЕЛЬЗЯ убирать т.к. падают TBuildIndexAndSearchTest
(* l_IndexName := f_BaseName + cIndexDeltaExt;
if Tm3StorageManager.StorageFileExists(l_IndexName) then
begin
f_IndexDeltaFiles.Add(l_IndexName);
l_Index := 1;
while true do
begin
l_Name := l_IndexName + IntToStr(l_Index);
if Tm3StorageManager.StorageFileExists(l_Name) then
begin
f_IndexDeltaFiles.Add(l_Name);
end//Tm3StorageManager.StorageFileExists(l_Name)
else
begin
l_IndexName := l_Name;
break;
end;//Tm3StorageManager.StorageFileExists(l_Name)
Inc(l_Index);
end;//while true
end;//Tm3StorageManager.StorageFileExists(l_IndexName)
f_NewIndexDeltaName := l_IndexName;
if not FileExists(f_BaseName + cIndexDeltasExt) then
if not f_IndexDeltaFiles.Empty then
SaveIndexDeltaFiles;*)
//end;//LoadFiles(cIndexDeltasExt, f_IndexDeltaFiles, l_Index)
end;//f_IndexDeltaFiles = nil
//#UC END# *5B4786110237_5B4782B40258_impl*
end;//Tm3DBHelper.CheckIndexDeltaFiles
procedure Tm3DBHelper.SaveFiles(const aFileName: AnsiString;
const aFiles: Im3FilesEnumerable;
const anExcludeFiles: Im3FilesEnumerable);
//#UC START# *5B503FBC002F_5B4782B40258_var*
function loc_DeleteFile(const aFileName: String): Boolean;
begin//loc_DeleteFile
try
if not FileExists(aFileName) then
Result := true
else
Result := SysUtils.DeleteFile(aFileName);
Exit;
except
on E: Exception do
begin
l3System.Exception2Log(E);
Result := false;
end;//on E: Exception
end;//try..except
end;//loc_DeleteFile
var
l_Filer : Tl3CustomFiler;
l_It : Im3FilesEnumerator;
l_Name : String;
l_FileName : String;
l_Written : Tl3StringList;
l_Write : Boolean;
l_Index : Integer;
//#UC END# *5B503FBC002F_5B4782B40258_var*
begin
//#UC START# *5B503FBC002F_5B4782B40258_impl*
l_FileName := f_BaseName + aFileName;
if (aFiles = nil) OR aFiles.Empty then
if loc_DeleteFile(l_FileName) then
Exit;
l_Written := nil;
try
l_Filer := Tl3DOSFiler.Make(l_FileName, l3_fmExclusiveWrite, false, cTimeOut);
try
l_Filer.TryOpen;
try
if (aFiles <> nil) then
begin
l_It := aFiles.GetEnumerator;
if (l_It <> nil) then
while l_It.MoveNext do
begin
l_Name := l_It.Current.AsString;
if Tm3StorageManager.StorageFileExists(l_Name) then
begin
if (anExcludeFiles = nil)
OR not anExcludeFiles.Has(l_It.Current)
then
begin
l_Write := true;
if (l_Written = nil) then
begin
l_Written := Tl3StringList.Create;
{$IfDef Linux}
l_Written.Sorted := true;
{$Else Linux}
l_Written.SortIndex := l3_siCaseUnSensitive;
{$EndIf Linux}
l_Written.Add(l_It.Current);
end//l_Written = nil
else
if l_Written.FindData(l_It.Current, l_Index, l_Written.SortIndex) then
l_Write := false
else
l_Written.Insert(l_Index, l_It.Current);
if l_Write then
begin
l_Name := ExtractFileName(l_Name);
l_Filer.WriteLn(l_Name);
end;//l_Write
end;//anExcludeFiles = nil
end;//Tm3StorageManager.StorageFileExists(l_Name)
end;//for l_Index
end;//aFiles <> nil
finally
l_Filer.Close;
end;//try..finally
finally
FreeAndNil(l_Filer);
end;//try..finally
finally
FreeAndNil(l_Written);
end;//try..finally
//#UC END# *5B503FBC002F_5B4782B40258_impl*
end;//Tm3DBHelper.SaveFiles
function Tm3DBHelper.LoadFiles(const aFileName: AnsiString;
var aFiles: Tl3StringList): Boolean;
//#UC START# *5B50439003A9_5B4782B40258_var*
var
l_Filer : Tl3CustomFiler;
l_Path : String;
l_Name : String;
l_FileName : String;
//#UC END# *5B50439003A9_5B4782B40258_var*
begin
//#UC START# *5B50439003A9_5B4782B40258_impl*
l_FileName := f_BaseName + aFileName;
Result := false;
if FileExists(l_FileName) then
begin
l_Filer := Tl3DOSFiler.Make(l_FileName, l3_fmRead, false, cTimeOut);
try
l_Filer.TryOpen;
try
Result := true;
l_Path := ExtractFilePath(f_BaseName);
while not l_Filer.EOF do
begin
l_Name := l3PCharLen2String(l_Filer.ReadLn);
if (l_Name = '') then
continue;
l_Name := ConcatDirName(l_Path, l_Name);
if Tm3StorageManager.StorageFileExists(l_Name) then
begin
{$If not Defined(Linux) OR not Defined(Archi)}
{$If not Defined(Linux) OR not Defined(nsTest)}
{$If not Defined(NanoServer)}
{$If not Defined(m3DBCheck)}
l3System.Msg2Log('Tm3DBHelper.LoadFiles: ' + l_Name);
{$IfEnd}
{$IfEnd}
{$IfEnd}
{$IfEnd}
AddToList(aFiles, l_Name);
end;//Tm3StorageManager.StorageFileExists(l_Name)
end;//while not l_Filer.EOF
finally
l_Filer.Close;
end;//try..finally
finally
FreeAndNil(l_Filer);
end;//try..finally
end;//FileExists(l_FileName)
//#UC END# *5B50439003A9_5B4782B40258_impl*
end;//Tm3DBHelper.LoadFiles
procedure Tm3DBHelper.SaveIndexDeltaFilesForPurge;
//#UC START# *5B50514D0055_5B4782B40258_var*
//#UC END# *5B50514D0055_5B4782B40258_var*
begin
//#UC START# *5B50514D0055_5B4782B40258_impl*
SaveFiles(cIndexDeltasForPurgeExt, f_IndexDeltaFilesForPurge.AsEnumerable, nil);
//#UC END# *5B50514D0055_5B4782B40258_impl*
end;//Tm3DBHelper.SaveIndexDeltaFilesForPurge
class function Tm3DBHelper.SafeDeleteStorageFile(const aFileName: AnsiString;
var aNotDeleted: Tl3StringList): Boolean;
//#UC START# *5B604DE30187_5B4782B40258_var*
var
l_WasIndex : Boolean;
//#UC END# *5B604DE30187_5B4782B40258_var*
begin
//#UC START# *5B604DE30187_5B4782B40258_impl*
Result := false;
l_WasIndex := Tm3StorageManager.StorageFileExists(aFileName);
try
Tm3StorageManager.DeleteStorageFile(aFileName);
except
on E: Exception do
begin
l3System.Exception2Log(E);
end;//on E: Exception
end;//try..except
if Tm3StorageManager.StorageFileExists(aFileName) then
begin
AddToList(aNotDeleted, aFileName);
end//Tm3StorageManager.StorageFileExists(l_Name)
else
begin
Result := true;
{$If not Defined(Linux) OR not Defined(Archi)}
{$If not Defined(Linux) OR not Defined(nsTest)}
{$If not Defined(NanoServer)}
{$If not Defined(m3DBCheck)}
if l_WasIndex then
l3System.Msg2Log('Index component deleted: ' + aFileName);
{$IfEnd}
{$IfEnd}
{$IfEnd}
{$IfEnd}
end;//Tm3StorageManager.StorageFileExists(aFileName)
//#UC END# *5B604DE30187_5B4782B40258_impl*
end;//Tm3DBHelper.SafeDeleteStorageFile
class function Tm3DBHelper.SafeDeleteStorageFiles(const aFiles: Im3FilesEnumerator;
var aNotDeleted: Tl3StringList): Boolean;
//#UC START# *5B6058E90206_5B4782B40258_var*
var
l_Name : String;
//#UC END# *5B6058E90206_5B4782B40258_var*
begin
//#UC START# *5B6058E90206_5B4782B40258_impl*
Result := true;
if (aFiles = nil) then
Exit;
while aFiles.MoveNext do
begin
l_Name := aFiles.Current.AsString;
if not SafeDeleteStorageFile(l_Name, aNotDeleted) then
Result := false;
end;//while aFiles.MoveNext
//#UC END# *5B6058E90206_5B4782B40258_impl*
end;//Tm3DBHelper.SafeDeleteStorageFiles
class function Tm3DBHelper.AddToList(var aList: Tl3StringList;
const aName: AnsiString): Boolean;
{* Добавляет значение в список без дубликатов }
//#UC START# *5B60666103E1_5B4782B40258_var*
var
l_Index : Integer;
//#UC END# *5B60666103E1_5B4782B40258_var*
begin
//#UC START# *5B60666103E1_5B4782B40258_impl*
Result := true;
if (aList = nil) then
aList := Tl3StringList.Create;
if not aList.FindData(aName, l_Index) then
aList.Add(aName)
else
Result := false;
//#UC END# *5B60666103E1_5B4782B40258_impl*
end;//Tm3DBHelper.AddToList
function Tm3DBHelper.DeleteIndexPrim: Boolean;
//#UC START# *5D2DFD27019C_5B4782B40258_var*
var
l_IndexName : String;
//#UC END# *5D2DFD27019C_5B4782B40258_var*
begin
//#UC START# *5D2DFD27019C_5B4782B40258_impl*
Result := false;
l_IndexName := Il3CString_ToFileName(Self.IndexName);
CheckIndexDeltaFiles;
if not SafeDeleteStorageFile(l_IndexName, f_IndexDeltaFilesForPurge) then
begin
SaveIndexDeltaFilesForPurge;
end//not SafeDeleteStorageFile(l_IndexName, f_IndexDeltaFilesForPurge)
else
Result := true;
//#UC END# *5D2DFD27019C_5B4782B40258_impl*
end;//Tm3DBHelper.DeleteIndexPrim
class function Tm3DBHelper.WStrToEnumerable(const aStr: Tl3WString): Im3FilesEnumerable;
{* Преобразует строку к списку }
//#UC START# *5E8CBFF800AA_5B4782B40258_var*
var
l_S : Tl3PrimString;
//#UC END# *5E8CBFF800AA_5B4782B40258_var*
begin
//#UC START# *5E8CBFF800AA_5B4782B40258_impl*
l_S := Tl3SharedConstString.CreateShared(aStr);
try
Result := Tl3StringList.ItemToEnumerable(l_S);
finally
FreeAndNil(l_S);
end;//try..finally
//#UC END# *5E8CBFF800AA_5B4782B40258_impl*
end;//Tm3DBHelper.WStrToEnumerable
function Tm3DBHelper.NewIndexDeltaNamePrim(const aFiles: Im3FilesEnumerable;
const anExt: TFileName): Il3CString;
//#UC START# *67D45BD20240_5B4782B40258_var*
var
l_Exists : Boolean;
{$IfDef m3CheckAttrIndexesNames}
function DoFile(const aFileName: string): Boolean;
begin//DoFile
Result := true;
if FileExists(aFileName) then
begin
if (Pos('.etalon.', ExtractFileName(aFileName)) > 0) then
Exit;
l_Exists := true;
Result := false;
end;//FileExists(aFileName)
end;//DoFile
{$EndIf m3CheckAttrIndexesNames}
var
l_Index : Integer;
l_Name : TFileName;
l_Deltas : Im3FilesEnumerable;
l_NewDeltas : Im3FilesEnumerable;
l_ForPurge : Im3FilesEnumerable;
l_S : Tl3PrimString;
l_Ext : TFileName;
l_Path : TFileName;
{$IfDef m3CheckAttrIndexesNames}
l_FPStub : Pointer;
{$EndIf m3CheckAttrIndexesNames}
l_Mask : TFileName;
{$IfDef m3CheckAttrIndexesNames}
l_NewMask : TFileName;
{$EndIf m3CheckAttrIndexesNames}
l_IsSubIndex : Boolean;
//#UC END# *67D45BD20240_5B4782B40258_var*
begin
//#UC START# *67D45BD20240_5B4782B40258_impl*
Result := nil;
l_Deltas := aFiles;
l_NewDeltas := Self.GetIndexDeltasFiles;
// - то что могли проиндексировать другие
l_ForPurge := Self.GetIndexForPurgeFiles;
if (l_Deltas = nil) then
// - отсекаем новые дельты
l_Deltas := l_NewDeltas
else
l_Deltas := l_Deltas.Join(l_NewDeltas);
if (l_Deltas = nil) then
// - отсекаем файлы помеченные для удаления
l_Deltas := l_ForPurge
else
l_Deltas := l_Deltas.Join(l_ForPurge);
l_Path := ExtractFilePath(f_BaseName);
l_Mask := ExtractFileName(f_BaseName);
l_IsSubIndex := AnsiEndsStr('#', l_Mask);
//Assert(not l_IsSubIndex);
l_Index := 0;
while true do
begin
if (l_Index = 0) then
l_Ext := anExt
else
l_Ext := anExt + Format('%.3x', [l_Index]);
l_Name := f_BaseName + l_Ext;
if not Tm3StorageManager.StorageFileExists(l_Name) then
begin
l_S := Tl3SharedConstString.CreateShared(l_Name);
try
if (l_Deltas = nil)
OR not l_Deltas.Has(l_S)
then
begin
l_Exists := false;
{$IfDef m3CheckAttrIndexesNames}
if not l_IsSubIndex then
begin
l_FPStub := l3LocalStub(@DoFile);
try
l_NewMask := l_Mask + '#*#' + l_Ext;
ProcessFilesWithMask(l_Path, l_NewMask, TFileProcessingFunc(l_FPStub));
finally
l3FreeLocalStub(l_FPStub);
end;//try..finally
end;//not l_IsSubIndex
{$EndIf m3CheckAttrIndexesNames}
if not l_Exists then
begin
Result := l_S.AsCStr;
break;
end;//not l_Exists
end;//l_Deltas = nil
finally
FreeAndNil(l_S);
end;//try..finally
end;//not Tm3StorageManager.StorageFileExists(l_Name)
Inc(l_Index);
end;//while true
Assert(not l3IsNil(Result));
//#UC END# *67D45BD20240_5B4782B40258_impl*
end;//Tm3DBHelper.NewIndexDeltaNamePrim
{$If NOT Defined(l3NoSRT)}
function Tm3DBHelper.SetRefTo(var thePlace: Tm3DBHelper): Boolean;
begin
if (thePlace = Self) then
Result := false
else
begin
Result := true;
thePlace.Free;
thePlace := Self.Use;
end;//thePlace = Self
end;//Tm3DBHelper.SetRefTo
{$IfEnd} // NOT Defined(l3NoSRT)
function Tm3DBHelper.GetIndexDeltasFiles: Im3FilesEnumerable;
{* Файлы дельты индекса }
//#UC START# *5B4780630310_5B4782B40258_var*
var
l_IndexDeltaFiles : Tl3StringList;
//#UC END# *5B4780630310_5B4782B40258_var*
begin
//#UC START# *5B4780630310_5B4782B40258_impl*
l_IndexDeltaFiles := Tl3StringList.Create;
try
LoadFiles(cIndexDeltasExt, l_IndexDeltaFiles);
Result := l_IndexDeltaFiles.AsEnumerable;
finally
FreeAndNil(l_IndexDeltaFiles);
end;//try..finally
//#UC END# *5B4780630310_5B4782B40258_impl*
end;//Tm3DBHelper.GetIndexDeltasFiles
function Tm3DBHelper.NewIndexDeltaName(const aFiles: Im3FilesEnumerable): Il3CString;
//#UC START# *5B478E6000BE_5B4782B40258_var*
(*var
l_Exists : Boolean;
function DoFile(const aFileName: string): Boolean;
begin//DoFile
Result := true;
if FileExists(aFileName) then
begin
if (Pos('.etalon.', ExtractFileName(aFileName)) > 0) then
Exit;
l_Exists := true;
Result := false;
end;//FileExists(aFileName)
end;//DoFile
var
l_Index : Integer;
l_Name : TFileName;
l_Deltas : Im3FilesEnumerable;
l_NewDeltas : Im3FilesEnumerable;
l_ForPurge : Im3FilesEnumerable;
l_S : Tl3PrimString;
l_Ext : TFileName;
l_Path : TFileName;
l_FPStub : Pointer;
l_Mask : TFileName;
l_NewMask : TFileName;
l_IsSubIndex : Boolean;*)
//#UC END# *5B478E6000BE_5B4782B40258_var*
begin
//#UC START# *5B478E6000BE_5B4782B40258_impl*
Result := Self.NewIndexDeltaNamePrim(aFiles, cIndexDeltaExt);
(* Result := nil;
l_Deltas := aFiles;
l_NewDeltas := Self.GetIndexDeltasFiles;
// - то что могли проиндексировать другие
l_ForPurge := Self.GetIndexForPurgeFiles;
if (l_Deltas = nil) then
// - отсекаем новые дельты
l_Deltas := l_NewDeltas
else
l_Deltas := l_Deltas.Join(l_NewDeltas);
if (l_Deltas = nil) then
// - отсекаем файлы помеченные для удаления
l_Deltas := l_ForPurge
else
l_Deltas := l_Deltas.Join(l_ForPurge);
l_Path := ExtractFilePath(f_BaseName);
l_Mask := ExtractFileName(f_BaseName);
l_IsSubIndex := AnsiEndsStr('#', l_Mask);
Assert(not l_IsSubIndex);
l_Index := 0;
while true do
begin
if (l_Index = 0) then
l_Ext := cIndexDeltaExt
else
l_Ext := cIndexDeltaExt + Format('%.3x', [l_Index]);
l_Name := f_BaseName + l_Ext;
if not Tm3StorageManager.StorageFileExists(l_Name) then
begin
l_S := Tl3SharedConstString.CreateShared(l_Name);
try
if (l_Deltas = nil)
OR not l_Deltas.Has(l_S)
then
begin
l_Exists := false;
l_FPStub := l3LocalStub(@DoFile);
try
l_NewMask := l_Mask + '#*#' + l_Ext;
ProcessFilesWithMask(l_Path, l_NewMask, TFileProcessingFunc(l_FPStub));
finally
l3FreeLocalStub(l_FPStub);
end;//try..finally
if not l_Exists then
begin
Result := l_S.AsCStr;
break;
end;//not l_Exists
end;//l_Deltas = nil
finally
FreeAndNil(l_S);
end;//try..finally
end;//not Tm3StorageManager.StorageFileExists(l_Name)
Inc(l_Index);
end;//while true
Assert(not l3IsNil(Result));*)
//#UC END# *5B478E6000BE_5B4782B40258_impl*
end;//Tm3DBHelper.NewIndexDeltaName
procedure Tm3DBHelper.AddNewIndexDeltaName(var aName: Il3CString;
var aFiles: Im3FilesEnumerable;
aNeedRenameToCanonical: Boolean = True);
//#UC START# *5B487D8C0027_5B4782B40258_var*
var
l_OldDeltas : Im3FilesEnumerable;
l_NewDeltas : Im3FilesEnumerable;
l_InsDelta : Im3FilesEnumerable;
l_WriteFiles : Im3FilesEnumerable;
l_CanonicalDelta : Im3FilesEnumerable;
l_CanonicalName : String;
l_PurgeFiles : Im3FilesEnumerable;
//#UC END# *5B487D8C0027_5B4782B40258_var*
begin
//#UC START# *5B487D8C0027_5B4782B40258_impl*
if Tm3StorageManager.StorageFileExists(aName) then
begin
l_OldDeltas := aFiles;
l_NewDeltas := Self.GetIndexDeltasFiles;
// - то что могли проиндексировать другие
l_InsDelta := Self.WStrToEnumerable(Tl3WString_C(aName));
// - добавляемые файлы
l_PurgeFiles := Self.GetIndexForPurgeFiles;
if false then
// -- пока выключим, т.к. по-моему это может плохо влиять на индексы атрибутов
if aNeedRenameToCanonical then
begin
l_CanonicalName := f_BaseName + cIndexDeltaExt;
if not Tm3StorageManager.StorageFileExists(l_CanonicalName) then
begin
l_CanonicalDelta := Self.WStrToEnumerable(Tl3WString_C(l_CanonicalName));
if (l_PurgeFiles = nil)
OR not l_PurgeFiles.Contains(l_CanonicalDelta) then
begin
if (l_OldDeltas = nil)
OR not l_OldDeltas.Contains(l_CanonicalDelta) then
begin
if (l_NewDeltas = nil)
OR not l_NewDeltas.Contains(l_CanonicalDelta) then
begin
if Tm3StorageManager.RenameStorageFile(Il3CString_ToFileName(aName), l_CanonicalName) then
begin
l_InsDelta := l_CanonicalDelta;
aName := Il3CString_C(l_CanonicalName);
end;//Tm3StorageManager.RenameStorageFile(Il3CString_ToFileName(aName), l_CanonicalName)
end;//l_NewDeltas = nil
end;//l_OldDeltas = nil
end;//l_PurgeFiles = nil
end;//not Tm3StorageManager.StorageFileExists(l_CanonicalName)
end;//aNeedRenameToCanonical
(* Assert(aFiles.Contains(l_NewDeltas));
SaveFiles(cIndexDeltasExt, aFiles, l_PurgeFiles);*)
l_WriteFiles := l_OldDeltas;
if (l_WriteFiles = nil) then
l_WriteFiles := l_InsDelta
else
l_WriteFiles := l_WriteFiles.Join(l_InsDelta);
if (l_WriteFiles = nil) then
l_WriteFiles := l_NewDeltas
else
if not l_WriteFiles.Contains(l_NewDeltas) then
// - чтобы одинаковые сразу отсечь
l_WriteFiles := l_WriteFiles.Join(l_NewDeltas);
SaveFiles(cIndexDeltasExt, l_WriteFiles, l_PurgeFiles);
if (aFiles = nil) then
aFiles := l_InsDelta
else
if not aFiles.Contains(l_InsDelta) then
aFiles := aFiles.Join(l_InsDelta);
end;//Tm3StorageManager.StorageFileExists(aName)
//#UC END# *5B487D8C0027_5B4782B40258_impl*
end;//Tm3DBHelper.AddNewIndexDeltaName
function Tm3DBHelper.LockDeltas(const aFiles: Im3FilesEnumerable): Boolean;
{* Пытается захватить индексы. Если они уже захвачены, то возвращает false }
//#UC START# *5B488D6C0297_5B4782B40258_var*
{$IfDef Linux}
// 438 = 666 octal which is rw rw rw
const
DEFAULT_RIGHTS = &666;
//DEFAULT_RIGHTS = 438;
{$EndIf Linux}
var
l_Index : Integer;
l_It : Im3FilesEnumerator;
{$IfDef Never}
l_FileDate : TDateTime;
l_Now : TDateTime;
{$EndIf Never}
{$IfDef Linux}
l_Handle : System.THandle;
l_StrToWrite : AnsiString;
l_NeedWrite : DWORD;
l_Written : DWORD;
{$Else Linux}
l_StrToWrite : AnsiString;
l_NeedWrite : DWORD;
l_Written : DWORD;
{$EndIf Linux}
l_Path : TFileName;
//#UC END# *5B488D6C0297_5B4782B40258_var*
begin
//#UC START# *5B488D6C0297_5B4782B40258_impl*
l_Path := ExtractFilePath(f_BaseName);
if not DirectoryExists(l_Path) then
raise Exception.Create(l3ForceUTF8FPC('Не существует папка: ' + l_Path));
f_FlagName := f_BaseName + '.lockidx';
if FileExists(f_FlagName) then
begin
Sleep(1000);
// -- wait - maybe it will bee freed
// - подождём, может кто-то доделает свои дела и отпустит
end;//FileExists(f_FlagName)
{$IfDef Linux}
Result := false;
if FileExists(f_FlagName) then
begin
Sleep(500);
end;//FileExists(f_FlagName)
if FileExists(f_FlagName) then
begin
l_Handle := MyfpOpen(f_FlagName, O_RdWr, DEFAULT_RIGHTS, 0{dwShareMode}, OPEN_EXISTING{dwCreationDisposition});
//l_Handle := MyfpOpen(f_FlagName, {O_Creat OR }O_RdWr OR O_Trunc, DEFAULT_RIGHTS, 0{dwShareMode}, OPEN_EXISTING{dwCreationDisposition});
(* f_FlagHandle := CreateFile(PChar(f_FlagName),
GENERIC_WRITE {GENERIC_READ},
0 {FILE_SHARE_READ},
nil,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
0);*)
if (l_Handle < 0) then
begin
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//l_Handle < 0
if not FileTruncate(l_Handle, 0) then
begin
FileClose(l_Handle);
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not FileTruncate(l_Handle, 0)
end//FileExists(f_FlagName)
else
begin
l_Handle := MyfpOpen(f_FlagName, O_Creat OR O_RdWr OR O_Trunc, DEFAULT_RIGHTS, 0{dwShareMode}, CREATE_NEW{dwCreationDisposition});
(* f_FlagHandle := CreateFile(PChar(f_FlagName),
GENERIC_WRITE {GENERIC_READ},
0 {FILE_SHARE_READ},
nil,
CREATE_NEW {OPEN_EXISTING},
FILE_FLAG_SEQUENTIAL_SCAN,
0);*)
end;//FileExists(f_FlagName)
if (l_Handle < 0) then
begin
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//l_Handle < 0
f_FlagHandle := l_Handle;
if (f_FlagHandle = {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE) then
begin
Result := false;
Exit;
end;//f_FlagHandle = {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE
{$IfNDef l3EmulateExclusiveWthLock}
if not LockFile(f_FlagHandle, 0, 0, 1, 0) then
begin
FileClose(Integer(f_FlagHandle));
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not LockFile(f_FlagHandle, 0, 0, 1, 0)
{$EndIf l3EmulateExclusiveWthLock}
//l_StrToWrite := ParamStr(0);
l_StrToWrite := '';
for l_Index := 0 to ParamCount do
l_StrToWrite := l_StrToWrite + ParamStr(l_Index) + #32{#13#10};
l_NeedWrite := Length(l_StrToWrite);
if not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil) then
begin
FileClose(Integer(f_FlagHandle));
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil)
if (l_NeedWrite <> l_Written) then
begin
FileClose(Integer(f_FlagHandle));
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//l_NeedWrite <> l_Written
if (aFiles <> nil) then
begin
l_It := aFiles.GetEnumerator;
if (l_It <> nil) then
while l_It.MoveNext do
begin
l_StrToWrite := #13#10 + l_It.Current.AsString;
l_NeedWrite := Length(l_StrToWrite);
if not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil) then
begin
FileClose(Integer(f_FlagHandle));
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil)
if (l_NeedWrite <> l_Written) then
begin
FileClose(Integer(f_FlagHandle));
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//l_NeedWrite <> l_Written
end;//l_It.MoveNext
end;//aFiles <> nil
Result := true;
Inc(g_WeAreLocker);
Exit;
{$Else Linux}
Result := false;
if FileExists(f_FlagName) then
begin
Sleep(500);
end;//FileExists(f_FlagName)
if FileExists(f_FlagName) then
begin
f_FlagHandle := CreateFile(PChar(f_FlagName),
GENERIC_WRITE {GENERIC_READ},
0 {FILE_SHARE_READ},
nil,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
0);
if (f_FlagHandle = {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE) then
begin
Result := false;
Exit;
end;//f_FlagHandle = {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE
if not SetEndOfFile(f_FlagHandle) then
begin
CloseHandle(f_FlagHandle);
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not SetEndOfFile(f_FlagHandle)
end//FileExists(f_FlagName)
else
begin
f_FlagHandle := CreateFile(PChar(f_FlagName),
GENERIC_WRITE {GENERIC_READ},
0 {FILE_SHARE_READ},
nil,
CREATE_NEW {OPEN_EXISTING},
FILE_FLAG_SEQUENTIAL_SCAN,
0);
end;//FileExists(f_FlagName)
if (f_FlagHandle = {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE) then
begin
Result := false;
Exit;
end;//f_FlagHandle = {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE
if not LockFile(f_FlagHandle, 0, 0, 1, 0) then
begin
CloseHandle(f_FlagHandle);
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not LockFile(f_FlagHandle, 0, 0, 1, 0)
//l_StrToWrite := ParamStr(0);
l_StrToWrite := '';
for l_Index := 0 to ParamCount do
l_StrToWrite := l_StrToWrite + ParamStr(l_Index) + #32{#13#10};
l_NeedWrite := Length(l_StrToWrite);
if not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil) then
begin
CloseHandle(f_FlagHandle);
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil)
if (l_NeedWrite <> l_Written) then
begin
CloseHandle(f_FlagHandle);
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//l_NeedWrite <> l_Written
if (aFiles <> nil) then
begin
l_It := aFiles.GetEnumerator;
if (l_It <> nil) then
while l_It.MoveNext do
begin
l_StrToWrite := #13#10 + l_It.Current.AsString;
l_NeedWrite := Length(l_StrToWrite);
if not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil) then
begin
CloseHandle(f_FlagHandle);
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//not WriteFile(f_FlagHandle, l_StrToWrite[1], l_NeedWrite, l_Written, nil)
if (l_NeedWrite <> l_Written) then
begin
CloseHandle(f_FlagHandle);
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
Result := false;
Exit;
end;//l_NeedWrite <> l_Written
end;//l_It.MoveNext
end;//aFiles <> nil
Result := true;
Inc(g_WeAreLocker);
Exit;
{$EndIf Linux}
{$IfDef Never}
if FileExists(f_FlagName) then
begin
Sleep(1000);
// -- wait - maybe it will bee freed
if FileExists(f_FlagName) then
begin
l_FileDate := l3FileUtils.FileDateTime(f_FlagName);
l_Now := Now;
if (DaysBetween(l_Now, l_FileDate) <= 0) then
begin
while true do
begin
if (MinutesBetween(l_Now, l_FileDate) > 5) then
break;
if not FileExists(f_FlagName) then
break;
Sleep(500);
l_Now := Now;
end;//while true
end;//DaysBetween(l_T1, l_T2) <= 0
end;//FileExists(f_FlagName)
if FileExists(f_FlagName) then
begin
{$IfDef Linux}
try
// - before deletion check if file busy
f_FlagFiler := Tl3DOSFiler.Make(f_FlagName, l3_fmExclusiveWrite, false, 0{cTimeOut});
try
f_FlagFiler.Open;
//f_FlagFiler.TryOpen;
except
on E: Exception do
begin
{$IfDef Linux}
//l3System.Exception2Log(E);
{$Else Linux}
l3System.Exception2Log(E);
{$EndIf Linux}
FreeAndNil(f_FlagFiler);
Result := false;
Exit;
end//on E: Exception
end;//try..except
if not f_FlagFiler.Opened then
begin
FreeAndNil(f_FlagFiler);
Result := false;
Exit;
end;//not f_FlagFiler.Opened
finally
FreeAndNil(f_FlagFiler);
end;//try..finally
{$EndIf Linux}
end;//FileExists(f_FlagName)
if FileExists(f_FlagName) then
begin
if not SysUtils.DeleteFile(f_FlagName)
// - тут попытались удалить залочку
OR FileExists(f_FlagName) then
begin
Result := false;
Exit;
end;//not DeleteFile(f_FlagName)
end;//FileExists(f_FlagName)
end;//FileExists(f_FlagName)
f_FlagFiler := Tl3DOSFiler.Make(f_FlagName, l3_fmExclusiveWrite, false, cTimeOut);
try
f_FlagFiler.TryOpen({$IfDef Linux}false{$EndIf});
except
on E: Exception do
begin
{$IfDef Linux}
//l3System.Exception2Log(E);
{$Else Linux}
l3System.Exception2Log(E);
{$EndIf Linux}
FreeAndNil(f_FlagFiler);
Result := false;
Exit;
end//on E: Exception
end;//try..except
if not f_FlagFiler.Opened then
begin
FreeAndNil(f_FlagFiler);
Result := false;
Exit;
end;//not f_FlagFiler.Opened
f_FlagFiler.Write(ParamStr(0));
for l_Index := 1 to ParamCount do
//for l_Index := 0 to ParamCount do
begin
f_FlagFiler.Write(' ');
f_FlagFiler.Write(ParamStr(l_Index));
end;//for l_Index
f_FlagFiler.WriteLn('');
if (aFiles <> nil) then
begin
l_It := aFiles.GetEnumerator;
if (l_It <> nil) then
while l_It.MoveNext do
f_FlagFiler.WriteLn(l_It.Current.AsString);
end;//aFiles <> nil
f_FlagFiler.Flush;
Result := true;
Inc(g_WeAreLocker);
{$EndIf Never}
//#UC END# *5B488D6C0297_5B4782B40258_impl*
end;//Tm3DBHelper.LockDeltas
procedure Tm3DBHelper.UnlockDeltas;
{* Освобождает захваченные индексы }
//#UC START# *5B488D860314_5B4782B40258_var*
var
l_FlagNameBack : String;
//#UC END# *5B488D860314_5B4782B40258_var*
begin
//#UC START# *5B488D860314_5B4782B40258_impl*
if (f_FlagHandle <> {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE) then
begin
Dec(g_WeAreLocker);
{$IfDef Never}
Assert(f_FlagFiler = nil);
{$EndIf Never}
{$IfDef Linux}
if not UnlockFile(f_FlagHandle, 0, 0, 1, 0) then
Assert(false);
FileClose(Integer(f_FlagHandle));
{$Else}
if not UnlockFile(f_FlagHandle, 0, 0, 1, 0) then
Assert(false);
CloseHandle(f_FlagHandle);
{$EndIf}
f_FlagHandle := {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE;
try
l_FlagNameBack := f_FlagName + cBackExt;
SysUtils.DeleteFile(l_FlagNameBack);
if g_NoBackCopy then
SysUtils.DeleteFile(f_FlagName)
else
SysUtils.RenameFile(f_FlagName, l_FlagNameBack);
except
on E: Exception do
begin
l3System.Exception2Log(E);
end//on E: Exception
end;//try..except
SysUtils.DeleteFile(f_FlagName);
Exit;
end;//f_FlagHandle <> {$IfDef Linux}l3LinWindows.{$EndIf}INVALID_HANDLE_VALUE
{$IfDef Never}
if (f_FlagFiler <> nil) then
begin
FreeAndNil(f_FlagFiler);
try
l_FlagNameBack := f_FlagName + cBackExt;
if g_NoBackCopy then
SysUtils.DeleteFile(f_FlagName)
else
SysUtils.RenameFile(f_FlagName, l_FlagNameBack);
SysUtils.RenameFile(f_FlagName, l_FlagNameBack);
except
on E: Exception do
begin
l3System.Exception2Log(E);
end//on E: Exception
end;//try..except
SysUtils.DeleteFile(f_FlagName);
end;//f_FlagFiler <> nil
{$EndIf Never}
//#UC END# *5B488D860314_5B4782B40258_impl*
end;//Tm3DBHelper.UnlockDeltas
function Tm3DBHelper.DeleteIndexDeltas(var aFiles: Im3FilesEnumerable;
aKeepNewDeltas: Boolean): Boolean;
//#UC START# *5B48A66302F3_5B4782B40258_var*
var
l_NotDeleted : Tl3StringList;
l_OldDeltas : Im3FilesEnumerable;
l_NewDeltas : Im3FilesEnumerable;
//#UC END# *5B48A66302F3_5B4782B40258_var*
begin
//#UC START# *5B48A66302F3_5B4782B40258_impl*
Result := false;
l_NotDeleted := nil;
try
l_OldDeltas := aFiles;
if (l_OldDeltas = nil) then
l_OldDeltas := Self.GetIndexForPurgeFiles
else
l_OldDeltas := l_OldDeltas.Join(Self.GetIndexForPurgeFiles);
if (l_OldDeltas <> nil) then
begin
Tm3StorageHolderList.DropFiles(l_OldDeltas);
SafeDeleteStorageFiles(l_OldDeltas.GetEnumerator, l_NotDeleted);
end;//l_OldDeltas <> nil
FreeAndNil(f_IndexDeltaFilesForPurge);
if aKeepNewDeltas then
l_NewDeltas := Self.GetIndexDeltasFiles
// - то что могли проиндексировать другие
else
l_NewDeltas := nil;
//DeleteFile(f_BaseName + cIndexDeltasExt);
SysUtils.DeleteFile(f_BaseName + cIndexDeltasForPurgeExt);
if (l_NotDeleted <> nil) AND not l_NotDeleted.Empty then
begin
l_NotDeleted.SetRefTo(f_IndexDeltaFilesForPurge);
SaveIndexDeltaFilesForPurge;
end//l_NotDeleted <> nil
else
Result := true;
if (l_OldDeltas = nil) then
// - тут добавляем новые файлы для удаления
l_OldDeltas := Self.GetIndexForPurgeFiles
else
l_OldDeltas := l_OldDeltas.Join(Self.GetIndexForPurgeFiles);
//if (l_NewDeltas <> nil) AND not l_NewDeltas.Empty then
SaveFiles(cIndexDeltasExt, l_NewDeltas, l_OldDeltas);
aFiles := nil;
// - "наших" дельт нет. Есть дельты, которые записали ПОСЛЕ нас
finally
FreeAndNil(l_NotDeleted);
end;//try..finally
//#UC END# *5B48A66302F3_5B4782B40258_impl*
end;//Tm3DBHelper.DeleteIndexDeltas
function Tm3DBHelper.IndexName: Il3CString;
//#UC START# *5B4DC5B502A5_5B4782B40258_var*
var
l_FileName : String;
l_Filer : Tl3CustomFiler;
l_S : String;
//#UC END# *5B4DC5B502A5_5B4782B40258_var*
begin
//#UC START# *5B4DC5B502A5_5B4782B40258_impl*
Result := nil;
l_FileName := f_BaseName + cIndexRefExt;
if FileExists(l_FileName) then
begin
l_Filer := Tl3DOSFiler.Make(l_FileName, l3_fmRead, false, cTimeOut);
try
l_Filer.TryOpen;
try
while not l_Filer.EOF do
begin
l_S := l3PCharLen2String(l_Filer.ReadLn);
if (l_S <> '') then
begin
Result := Il3CString_C(ConcatDirName(ExtractFilePath(f_BaseName), l_S));
break;
end;//l_S <> ''
end;//while not l_Filer.EOF
finally
l_Filer.Close;
end;//try..finally
finally
FreeAndNil(l_Filer);
end;//try..finally
end;//FileExists(l_FileName)
if l3IsNil(Result) then
begin
Result := Il3CString_C(f_BaseName + cIndexExt);
l_Filer := Tl3DOSFiler.Make(l_FileName, l3_fmExclusiveWrite, false, cTimeOut);
try
l_Filer.TryOpen;
try
l_Filer.WriteLn(ExtractFileName(Il3CString_ToFileName(Result)));
finally
l_Filer.Close;
end;//try..finally
finally
FreeAndNil(l_Filer);
end;//try..finally
end;//l3IsNil(Result)
//#UC END# *5B4DC5B502A5_5B4782B40258_impl*
end;//Tm3DBHelper.IndexName
function Tm3DBHelper.GetIndexForPurgeFiles: Im3FilesEnumerable;
{* "Провисшие" файлы для удаления }
//#UC START# *5B50400301C4_5B4782B40258_var*
//#UC END# *5B50400301C4_5B4782B40258_var*
begin
//#UC START# *5B50400301C4_5B4782B40258_impl*
CheckIndexDeltaFiles;
Result := f_IndexDeltaFilesForPurge.AsEnumerable;
//#UC END# *5B50400301C4_5B4782B40258_impl*
end;//Tm3DBHelper.GetIndexForPurgeFiles
function Tm3DBHelper.NewIndexName: Il3CString;
//#UC START# *5B5F0C9203A7_5B4782B40258_var*
(*var
l_Ext : String;
l_Num : Integer;
l_Res : String;*)
//#UC END# *5B5F0C9203A7_5B4782B40258_var*
begin
//#UC START# *5B5F0C9203A7_5B4782B40258_impl*
Result := Self.NewIndexDeltaNamePrim(nil, cIndexExt);
(* l_Res := Il3CString_ToFileName(IndexName);
l_Ext := ExtractFileExt(l_Res);
System.Delete(l_Ext, 1, Length(cIndexExt));
l_Num := 0;
if (l_Ext <> '') then
begin
if not TryStrToInt(l_Ext, l_Num) then
l_Num := 0;
end;//l_Ext <> ''
Inc(l_Num);
Assert(l_Num > 0);
Result := Il3CString_C(ChangeFileExt(l_Res, cIndexExt + Format('%.3x', [l_Num])));
//Result := Il3CString_C(ChangeFileExt(l_Res, cIndexExt + IntToStr(l_Num)));*)
//#UC END# *5B5F0C9203A7_5B4782B40258_impl*
end;//Tm3DBHelper.NewIndexName
procedure Tm3DBHelper.SetNewIndexName(var aName: Il3CString);
//#UC START# *5B5F17AC01D0_5B4782B40258_var*
var
l_IndexName : Il3CString;
l_Filer : Tl3CustomFiler;
l_Ext : TFileName;
//#UC END# *5B5F17AC01D0_5B4782B40258_var*
begin
//#UC START# *5B5F17AC01D0_5B4782B40258_impl*
if Tm3StorageManager.StorageFileExists(aName) then
begin
l_Ext := ExtractFileExt(Il3CString_ToFileName(aName));
l_IndexName := IndexName;
if Il3CString_Equals(l_IndexName, aName) then
begin
aName := l_IndexName;
// - это присвоение - чисто для отладки
Exit;
end;//Il3CString_Equals(l_IndexName, aName)
if (l_Ext = '.idx') then
// https://mdp.garant.ru/pages/viewpage.action?pageId=892633731
begin
DeleteIndexPrim;
// - удаляем ПРЕДЫДУЩИЙ индекс, но новый НЕ переименовываем
end//l_Ext = '.idx'
else
begin
if DeleteIndexPrim then
begin
Tm3StorageManager.RenameStorageFile(aName, l_IndexName);
aName := l_IndexName;
// - возвращаем обратно новое значение
Exit;
end;//DeleteIndexPrim
end;//l_Ext = '.idx'
//else
begin
l_Filer := Tl3DOSFiler.Make(f_BaseName + cIndexRefExt, l3_fmExclusiveWrite, false, cTimeOut);
try
l_Filer.TryOpen;
try
l_Filer.WriteLn(ExtractFileName(Il3CString_ToFileName(aName)));
finally
l_Filer.Close;
end;//try..finally
finally
FreeAndNil(l_Filer);
end;//try..finally
end;//DeleteIndexPrim
end;//Tm3StorageManager.StorageFileExists(aName)
//#UC END# *5B5F17AC01D0_5B4782B40258_impl*
end;//Tm3DBHelper.SetNewIndexName
function Tm3DBHelper.DeleteIndex: Boolean;
//#UC START# *5B615D7F01CC_5B4782B40258_var*
procedure DeleteAttrIndexes;
procedure DoDeleteAttrIndexes;
var
l_NotDeleted: Tl3StringList;
function DoFile1(const aFileName: string): Boolean;
begin//DoFile1
Result := true;
if FileExists(aFileName) then
begin
if (Pos('.etalon.', ExtractFileName(aFileName)) > 0) then
Exit;
Self.SafeDeleteStorageFile(aFileName, l_NotDeleted);
//Tm3StorageManager.DeleteStorageFile(aFileName);
// - !!! тут надо не забыть про SafeDeleteStorageFile
//SysUtils.DeleteFile(aFileName);
end;//FileExists(aFileName)
end;//DoFile1
var
l_FPStub : Pointer;
var
l_Mask : TFileName;
var
l_Folder : String;
begin//DoDeleteAttrIndexes
// !!! тут надо подумать про DeleteAttrIndexes vs. DeleteAllIndexDeltas !!!
l_Folder := ExtractFilePath(f_BaseName);
l_Mask := ExtractFileName(f_BaseName) + '#' + '*' + '#';
l_Mask := l_Mask + '.idx*';
//l_Mask := l_Mask + '.*';
//l_Mask := cMask;
l_NotDeleted := nil;
try
l_FPStub := l3LocalStub(@DoFile1);
try
ProcessFilesWithMask(l_Folder, l_Mask, TFileProcessingFunc(l_FPStub));
finally
l3FreeLocalStub(l_FPStub);
end;//try..finally
l_Mask := ExtractFileName(f_BaseName) + '#' + '*' + '#';
l_Mask := l_Mask + cIndexRefExt;
l_FPStub := l3LocalStub(@DoFile1);
try
ProcessFilesWithMask(l_Folder, l_Mask, TFileProcessingFunc(l_FPStub));
finally
l3FreeLocalStub(l_FPStub);
end;//try..finally
if (l_NotDeleted <> nil) AND not l_NotDeleted.Empty then
begin
l_NotDeleted.SetRefTo(f_IndexDeltaFilesForPurge);
SaveIndexDeltaFilesForPurge;
end;//l_NotDeleted <> nil
finally
FreeAndNil(l_NotDeleted);
end;//try..finally
end;//DoDeleteAttrIndexes
begin//DeleteAttrIndexes
DoDeleteAttrIndexes;
DoDeleteAttrIndexes;
// - twice because of Linux BUG.
end;//DeleteAttrIndexes
var
l_FileName : String;
//#UC END# *5B615D7F01CC_5B4782B40258_var*
begin
//#UC START# *5B615D7F01CC_5B4782B40258_impl*
Result := DeleteIndexPrim;
if Result then
begin
l_FileName := f_BaseName + cIndexRefExt;
if FileExists(l_FileName) then
SysUtils.DeleteFile(l_FileName);
end;//Result
DeleteAttrIndexes;
//#UC END# *5B615D7F01CC_5B4782B40258_impl*
end;//Tm3DBHelper.DeleteIndex
procedure Tm3DBHelper.PurgeIndexDeltas;
//#UC START# *5D47E7D002A1_5B4782B40258_var*
var
l_NotDeleted : Tl3StringList;
l_E : Im3FilesEnumerable;
//#UC END# *5D47E7D002A1_5B4782B40258_var*
begin
//#UC START# *5D47E7D002A1_5B4782B40258_impl*
try
l_NotDeleted := nil;
try
CheckIndexDeltaFiles;
if (f_IndexDeltaFilesForPurge <> nil)
AND (f_IndexDeltaFilesForPurge.Count > 0) then
begin
//SafeDeleteStorageFiles(Self.GetIndexDeltasFiles, l_NotDeleted);
l_E := Self.GetIndexForPurgeFiles;
if (l_E <> nil) then
begin
Tm3StorageHolderList.DropFiles(l_E);
SafeDeleteStorageFiles(l_E.GetEnumerator, l_NotDeleted);
end;//l_E <> nil
l_E := nil;
//DeleteFile(f_BaseName + cIndexDeltasExt);
SysUtils.DeleteFile(f_BaseName + cIndexDeltasForPurgeExt);
FreeAndNil(f_IndexDeltaFilesForPurge);
if (l_NotDeleted <> nil) AND not l_NotDeleted.Empty then
begin
l_NotDeleted.SetRefTo(f_IndexDeltaFilesForPurge);
SaveIndexDeltaFilesForPurge;
end;//l_NotDeleted <> nil
end;//f_IndexDeltaFilesForPurge <> nil
finally
FreeAndNil(l_NotDeleted);
end;//try..finally
except
on E: Exception do
begin
l3System.Exception2Log(E);
end;//on E: Exception
end;//try..except
//#UC END# *5D47E7D002A1_5B4782B40258_impl*
end;//Tm3DBHelper.PurgeIndexDeltas
function Tm3DBHelper.DeleteAllIndexDeltas: Boolean;
//#UC START# *5E85C0CE0249_5B4782B40258_var*
var
l_E : Im3FilesEnumerable;
//#UC END# *5E85C0CE0249_5B4782B40258_var*
begin
//#UC START# *5E85C0CE0249_5B4782B40258_impl*
l_E := Self.GetIndexDeltasFiles;
Result := DeleteIndexDeltas(l_E, false);
//#UC END# *5E85C0CE0249_5B4782B40258_impl*
end;//Tm3DBHelper.DeleteAllIndexDeltas
function Tm3DBHelper.GetAllIndexFiles: Im3FilesEnumerable;
{* Все файлы индекса для поиска или объединения }
//#UC START# *5E8C9C7E0334_5B4782B40258_var*
var
l_Index : Im3FilesEnumerable;
//#UC END# *5E8C9C7E0334_5B4782B40258_var*
begin
//#UC START# *5E8C9C7E0334_5B4782B40258_impl*
Result := Self.GetIndexDeltasFiles;
l_Index := Self.GetIndexMainFiles;
if (l_Index <> nil) then
Result := l_Index.Join(Result);
//#UC END# *5E8C9C7E0334_5B4782B40258_impl*
end;//Tm3DBHelper.GetAllIndexFiles
function Tm3DBHelper.GetIndexMainFiles: Im3FilesEnumerable;
{* Файлы основной части индекса (то что раньше было IndexName) }
//#UC START# *5E95ADFB0091_5B4782B40258_var*
var
l_IndexName : Il3CString;
//#UC END# *5E95ADFB0091_5B4782B40258_var*
begin
//#UC START# *5E95ADFB0091_5B4782B40258_impl*
Result := nil;
l_IndexName := Self.IndexName;
if Tm3StorageManager.StorageFileExists(l_IndexName) then
begin
Result := Self.WStrToEnumerable(Tl3WString_C(l_IndexName));
end;//Tm3StorageManager.StorageFileExists(l_IndexName)
//#UC END# *5E95ADFB0091_5B4782B40258_impl*
end;//Tm3DBHelper.GetIndexMainFiles
function Tm3DBHelper.Get_BaseName: AnsiString;
//#UC START# *671A7F340112_5B4782B40258get_var*
//#UC END# *671A7F340112_5B4782B40258get_var*
begin
//#UC START# *671A7F340112_5B4782B40258get_impl*
Result := Self.f_BaseName;
//#UC END# *671A7F340112_5B4782B40258get_impl*
end;//Tm3DBHelper.Get_BaseName
function Tm3DBHelper.TryLockDeltas(const aFiles: Im3FilesEnumerable): Boolean;
{* Пытается захватить индексы. Может это делать в цикле, с таймаутом }
//#UC START# *68DA67BA037F_5B4782B40258_var*
const
cMax = 5 * 60 * 1000;
var
l_Now : Cardinal;
//#UC END# *68DA67BA037F_5B4782B40258_var*
begin
//#UC START# *68DA67BA037F_5B4782B40258_impl*
l_Now := GetTickCount;
while true do
begin
Result := Self.LockDeltas(aFiles);
if Result then
break;
if l3IsTimeElapsed(l_Now, cMax) then
break;
end;//while true
//#UC END# *68DA67BA037F_5B4782B40258_impl*
end;//Tm3DBHelper.TryLockDeltas
procedure Tm3DBHelper.Cleanup;
{* Функция очистки полей объекта. }
//#UC START# *479731C50290_5B4782B40258_var*
//#UC END# *479731C50290_5B4782B40258_var*
begin
//#UC START# *479731C50290_5B4782B40258_impl*
//UnlockDeltas;
inherited;
FreeAndNil(f_IndexDeltaFilesForPurge);
{$IfDef Never}
FreeAndNil(f_FlagFiler);
{$EndIf Never}
f_FlagName := '';
f_BaseName := '';
//#UC END# *479731C50290_5B4782B40258_impl*
end;//Tm3DBHelper.Cleanup
procedure Tm3DBHelper.BeforeFree;
{* функция, вызываемая при каждом уменьшении счетчика ссылок на 1. Вернув false может запретить уничтожение объекта. }
//#UC START# *48B2BE560115_5B4782B40258_var*
//#UC END# *48B2BE560115_5B4782B40258_var*
begin
//#UC START# *48B2BE560115_5B4782B40258_impl*
inherited;
//#UC END# *48B2BE560115_5B4782B40258_impl*
end;//Tm3DBHelper.BeforeFree
procedure Tm3DBHelper.BeforeRelease;
//#UC START# *49BFC98902FF_5B4782B40258_var*
//#UC END# *49BFC98902FF_5B4782B40258_var*
begin
//#UC START# *49BFC98902FF_5B4782B40258_impl*
//UnlockDeltas;
inherited;
//#UC END# *49BFC98902FF_5B4782B40258_impl*
end;//Tm3DBHelper.BeforeRelease
//#UC START# *5B4782B40258impl*
//#UC END# *5B4782B40258impl*
{$If NOT Defined(NoScripts)}
class function TTm3DBHelperKeywordsPackResNameGetter.ResName: AnsiString;
begin
Result := 'Tm3DBHelperKeywordsPack';
end;//TTm3DBHelperKeywordsPackResNameGetter.ResName
{$R Tm3DBHelperKeywordsPack.res}
{$IfEnd} // NOT Defined(NoScripts)
initialization
{$If NOT Defined(NoScripts)}
TtfwClassRef_Proxy.TtfwClassRef.Register(TypeInfo(Tm3DBHelper));
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperClassCreate.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperClassKeywordsPack_Tm3DBHelperClass_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperClassCreate_Tm3DBHelper_ResultTypeInfo)
.SetParamsTypesFunc(TkwTm3DBHelperClassCreate_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperClassCreate_DoIt)
.SetMethodName('Create'), ['m3DBHelperClass:Create', '.Tm3DBHelperClass.Create']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperClassMake.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperClassKeywordsPack_Tm3DBHelperClass_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperClassMake_Im3DBHelper_ResultTypeInfo)
.SetParamsTypesFunc(TkwTm3DBHelperClassMake_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperClassMake_DoIt)
.SetMethodName('Make'), ['m3DBHelperClass:Make', '.Tm3DBHelperClass.Make', 'pop:m3DBHelperClass:Make']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperClassWStrToEnumerable.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperClassKeywordsPack_Tm3DBHelperClass_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperClassWStrToEnumerable_Im3FilesEnumerable_ResultTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperClassWStrToEnumerable_Documentation)
.SetParamsTypesFunc(TkwTm3DBHelperClassWStrToEnumerable_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperClassWStrToEnumerable_DoIt)
.SetMethodName('WStrToEnumerable'), ['m3DBHelperClass:WStrToEnumerable', '.Tm3DBHelperClass.WStrToEnumerable', 'pop:m3DBHelperClass:WStrToEnumerable']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TtfwTypeRegistrator.RegisterType(TtfwValueTypes.MakeClassRef(TypeInfo(Tm3DBHelper))
, 'Ссылка на класс Tm3DBHelper');
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperBaseName.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperBaseName_AnsiString_ResultTypeInfo)
.SetDoItProc(TkwTm3DBHelperBaseName_DoIt)
.SetMethodName('BaseName'), ['m3DBHelper:BaseName', '.Tm3DBHelper.BaseName', 'pop:m3DBHelper:BaseName']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperCreate.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetParamsTypesFunc(TkwTm3DBHelperCreate_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperCreate_DoIt)
.SetMethodName('Create'), ['m3DBHelper:Create', '.Tm3DBHelper.Create']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperMake.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperMake_Im3DBHelper_ResultTypeInfo)
.SetParamsTypesFunc(TkwTm3DBHelperMake_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperMake_DoIt)
.SetMethodName('Make'), ['m3DBHelper:Make', '.Tm3DBHelper.Make', 'pop:m3DBHelper:Make']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperWStrToEnumerable.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperWStrToEnumerable_Im3FilesEnumerable_ResultTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperWStrToEnumerable_Documentation)
.SetParamsTypesFunc(TkwTm3DBHelperWStrToEnumerable_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperWStrToEnumerable_DoIt)
.SetMethodName('WStrToEnumerable'), ['m3DBHelper:WStrToEnumerable', '.Tm3DBHelper.WStrToEnumerable', 'pop:m3DBHelper:WStrToEnumerable']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetIndexDeltasFiles.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperGetIndexDeltasFiles_Im3FilesEnumerable_ResultTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperGetIndexDeltasFiles_Documentation)
.SetDoItProc(TkwTm3DBHelperGetIndexDeltasFiles_DoIt)
.SetMethodName('GetIndexDeltasFiles'), ['m3DBHelper:GetIndexDeltasFiles', '.Tm3DBHelper.GetIndexDeltasFiles', 'pop:m3DBHelper:GetIndexDeltasFiles']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperNewIndexDeltaName.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperNewIndexDeltaName_Il3CString_ResultTypeInfo)
.SetParamsTypesFunc(TkwTm3DBHelperNewIndexDeltaName_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperNewIndexDeltaName_DoIt)
.SetMethodName('NewIndexDeltaName'), ['m3DBHelper:NewIndexDeltaName', '.Tm3DBHelper.NewIndexDeltaName', 'pop:m3DBHelper:NewIndexDeltaName']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperLockDeltas.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperLockDeltas_Documentation)
.SetParamsTypesFunc(TkwTm3DBHelperLockDeltas_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperLockDeltas_DoIt)
.SetMethodName('LockDeltas'), ['m3DBHelper:LockDeltas', '.Tm3DBHelper.LockDeltas', 'pop:m3DBHelper:LockDeltas']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperUnlockDeltas.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperUnlockDeltas_Documentation)
.SetDoItProc(TkwTm3DBHelperUnlockDeltas_DoIt)
.SetMethodName('UnlockDeltas'), ['m3DBHelper:UnlockDeltas', '.Tm3DBHelper.UnlockDeltas', 'pop:m3DBHelper:UnlockDeltas']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperIndexName.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperIndexName_Il3CString_ResultTypeInfo)
.SetDoItProc(TkwTm3DBHelperIndexName_DoIt)
.SetMethodName('IndexName'), ['m3DBHelper:IndexName', '.Tm3DBHelper.IndexName', 'pop:m3DBHelper:IndexName']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetIndexForPurgeFiles.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperGetIndexForPurgeFiles_Im3FilesEnumerable_ResultTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperGetIndexForPurgeFiles_Documentation)
.SetDoItProc(TkwTm3DBHelperGetIndexForPurgeFiles_DoIt)
.SetMethodName('GetIndexForPurgeFiles'), ['m3DBHelper:GetIndexForPurgeFiles', '.Tm3DBHelper.GetIndexForPurgeFiles', 'pop:m3DBHelper:GetIndexForPurgeFiles']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperNewIndexName.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperNewIndexName_Il3CString_ResultTypeInfo)
.SetDoItProc(TkwTm3DBHelperNewIndexName_DoIt)
.SetMethodName('NewIndexName'), ['m3DBHelper:NewIndexName', '.Tm3DBHelper.NewIndexName', 'pop:m3DBHelper:NewIndexName']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperDeleteIndex.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetDoItProc(TkwTm3DBHelperDeleteIndex_DoIt)
.SetMethodName('DeleteIndex'), ['m3DBHelper:DeleteIndex', '.Tm3DBHelper.DeleteIndex', 'pop:m3DBHelper:DeleteIndex']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperPurgeIndexDeltas.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetDoItProc(TkwTm3DBHelperPurgeIndexDeltas_DoIt)
.SetMethodName('PurgeIndexDeltas'), ['m3DBHelper:PurgeIndexDeltas', '.Tm3DBHelper.PurgeIndexDeltas', 'pop:m3DBHelper:PurgeIndexDeltas']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperDeleteAllIndexDeltas.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetDoItProc(TkwTm3DBHelperDeleteAllIndexDeltas_DoIt)
.SetMethodName('DeleteAllIndexDeltas'), ['m3DBHelper:DeleteAllIndexDeltas', '.Tm3DBHelper.DeleteAllIndexDeltas', 'pop:m3DBHelper:DeleteAllIndexDeltas']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetAllIndexFiles.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperGetAllIndexFiles_Im3FilesEnumerable_ResultTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperGetAllIndexFiles_Documentation)
.SetDoItProc(TkwTm3DBHelperGetAllIndexFiles_DoIt)
.SetMethodName('GetAllIndexFiles'), ['m3DBHelper:GetAllIndexFiles', '.Tm3DBHelper.GetAllIndexFiles', 'pop:m3DBHelper:GetAllIndexFiles']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperGetIndexMainFiles.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetResultTypeInfo(TkwTm3DBHelperGetIndexMainFiles_Im3FilesEnumerable_ResultTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperGetIndexMainFiles_Documentation)
.SetDoItProc(TkwTm3DBHelperGetIndexMainFiles_DoIt)
.SetMethodName('GetIndexMainFiles'), ['m3DBHelper:GetIndexMainFiles', '.Tm3DBHelper.GetIndexMainFiles', 'pop:m3DBHelper:GetIndexMainFiles']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TkwTm3DBHelperTryLockDeltas.RegisterInEngine(TtfwRegisterContext_E
.SetSelfTypeInfo(Tm3DBHelperKeywordsPack_Tm3DBHelper_SelfTypeInfo)
.SetDocumentationFunc(TkwTm3DBHelperTryLockDeltas_Documentation)
.SetParamsTypesFunc(TkwTm3DBHelperTryLockDeltas_ParamsTypes)
.SetDoItProc(TkwTm3DBHelperTryLockDeltas_DoIt)
.SetMethodName('TryLockDeltas'), ['m3DBHelper:TryLockDeltas', '.Tm3DBHelper.TryLockDeltas', 'pop:m3DBHelper:TryLockDeltas']);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TTm3DBHelperKeywordsPackResNameGetter.Register;
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TtfwTypeRegistrator.RegisterType(TtfwTypeInfo.MakeString
, 'Стандартный строковый тип Delphi.');
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TtfwTypeRegistrator.RegisterType(TtfwTypeInfo.MakeBoolean);
{$IfEnd} // NOT Defined(NoScripts)
{$If NOT Defined(NoScripts)}
TtfwTypeRegistrator.RegisterType(TtfwTypeInfo.MakeString
, 'Строка с кодировкой и с длиной.');
{$IfEnd} // NOT Defined(NoScripts)
//#UC START# *5B4782B40258forDiagramm*
(*
*)
//#UC END# *5B4782B40258forDiagramm*
end.