1 /* 2 * Copyright 2010, Haiku. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Clemens Zeidler <haiku@clemens-zeidler.de> 7 */ 8 #include "FullTextAnalyser.h" 9 10 #include <new> 11 12 #include <Directory.h> 13 #include <String.h> 14 #include <TranslatorFormats.h> 15 #include <TranslatorRoster.h> 16 17 #include "CLuceneDataBase.h" 18 #include "IndexServerPrivate.h" 19 20 21 #define DEBUG_FULLTEXT_ANALYSER 22 #ifdef DEBUG_FULLTEXT_ANALYSER 23 #include <stdio.h> 24 # define STRACE(x...) printf("FullTextAnalyser: " x) 25 #else 26 # define STRACE(x...) ; 27 #endif 28 29 30 FullTextAnalyser::FullTextAnalyser(BString name, const BVolume& volume) 31 : 32 FileAnalyser(name, volume), 33 34 fWriteDataBase(NULL), 35 fNUncommited(0) 36 { 37 BDirectory dir; 38 volume.GetRootDirectory(&dir); 39 fDataBasePath.SetTo(&dir); 40 fDataBasePath.Append(kIndexServerDirectory); 41 status_t status = fDataBasePath.Append(kFullTextDirectory); 42 43 if (status == B_OK) 44 fWriteDataBase = new CLuceneWriteDataBase(fDataBasePath); 45 } 46 47 48 FullTextAnalyser::~FullTextAnalyser() 49 { 50 delete fWriteDataBase; 51 } 52 53 54 status_t 55 FullTextAnalyser::InitCheck() 56 { 57 if (fDataBasePath.InitCheck() != B_OK) 58 return fDataBasePath.InitCheck(); 59 if (!fWriteDataBase) 60 return B_NO_MEMORY; 61 62 return fWriteDataBase->InitCheck(); 63 } 64 65 66 void 67 FullTextAnalyser::AnalyseEntry(const entry_ref& ref) 68 { 69 if (!_InterestingEntry(ref)) 70 return; 71 72 //STRACE("FullTextAnalyser AnalyseEntry: %s %s\n", ref.name, path.Path()); 73 fWriteDataBase->AddDocument(ref); 74 75 fNUncommited++; 76 if (fNUncommited > 100) 77 LastEntry(); 78 } 79 80 81 void 82 FullTextAnalyser::DeleteEntry(const entry_ref& ref) 83 { 84 if (_IsInIndexDirectory(ref)) 85 return; 86 STRACE("FullTextAnalyser DeleteEntry: %s\n", ref.name); 87 fWriteDataBase->RemoveDocument(ref); 88 } 89 90 91 void 92 FullTextAnalyser::MoveEntry(const entry_ref& oldRef, const entry_ref& newRef) 93 { 94 if (!_InterestingEntry(newRef)) 95 return; 96 STRACE("FullTextAnalyser MoveEntry: %s to %s\n", oldRef.name, newRef.name); 97 fWriteDataBase->RemoveDocument(oldRef); 98 AnalyseEntry(newRef); 99 } 100 101 102 void 103 FullTextAnalyser::LastEntry() 104 { 105 fWriteDataBase->Commit(); 106 fNUncommited = 0; 107 } 108 109 110 bool 111 FullTextAnalyser::_InterestingEntry(const entry_ref& ref) 112 { 113 if (_IsInIndexDirectory(ref)) 114 return false; 115 116 BFile file(&ref, B_READ_ONLY); 117 translator_info translatorInfo; 118 if (BTranslatorRoster::Default()->Identify(&file, NULL, &translatorInfo, 0, 119 NULL, B_TRANSLATOR_TEXT) != B_OK) 120 return false; 121 122 return true; 123 } 124 125 126 bool 127 FullTextAnalyser::_IsInIndexDirectory(const entry_ref& ref) 128 { 129 BPath path(&ref); 130 if (BString(path.Path()).FindFirst(fDataBasePath.Path()) == 0) 131 return true; 132 133 if (BString(path.Path()).FindFirst("/boot/system/cache/tmp") == 0) 134 return true; 135 136 return false; 137 } 138 139 140 FullTextAddOn::FullTextAddOn(image_id id, const char* name) 141 : 142 IndexServerAddOn(id, name) 143 { 144 145 } 146 147 148 FileAnalyser* 149 FullTextAddOn::CreateFileAnalyser(const BVolume& volume) 150 { 151 return new (std::nothrow)FullTextAnalyser(Name(), volume); 152 } 153 154 155 extern "C" IndexServerAddOn* (instantiate_index_server_addon)(image_id id, 156 const char* name) 157 { 158 return new (std::nothrow)FullTextAddOn(id, name); 159 } 160