上一节中对于索引之前的初始化工作进行了分析,从这节开始,对于索引过程进行阐述。
2.2.3 indexPath索引文件过程
/* This should be printed by the module that's reading the source */ tmpswline = sw->dirlist; while (tmpswline != NULL) { if (sw->verbose) { printf("Indexing /"%s/"/n", tmpswline->line); fflush(stdout); } indexpath(sw, tmpswline->line); tmpswline = tmpswline->next; } /* * Invoke the methods of the current Indexing Data Source */ void indexpath(SWISH * sw, char *path) { /* invoke routine to index a "path" */ (*IndexingDataSource->indexpath_fn) (sw, path); } |
索引代码片段
对配置文件遍历以后,根据IndexDir 配置项将需要索引的目录通过链表方式放入到sw->dirlist; 遍历dirlist,通过indexpath函数进行索引。 |
索引代码分析
indexpath通过调用函数指针,执行 fs_indexpath(在fs.c文件中有定义)。
2.2.4 fs_indexpath函数分析
fs_indexpath函数先对于传入的path进行规则化,去除末尾的'/'等,然后根据path为文件或者
目录分开进行处理。
void fs_indexpath(SWISH * sw, char *path) {
normalize_path( path ); /* flip backslashes and remove trailing slash */
if (isdirectory(path)) { if (sw->verbose >= 2) printf("/nChecking dir /"%s/".../n", path);
indexadir(sw, path); }
else if (isfile(path)) { if (sw->verbose >= 2) printf("/nChecking file /"%s/".../n", path); indexafile(sw, path); } else progwarnno("Invalid path '%s': ", path); } |
fs_indexpath 代码片段
|
fs_indexpath 代码分析
2.2.5 printfile索引文件过程
printfile函数对于需要索引的文件先建立一个 FileProp文件属性对象,然后通过do_index_file进行索引。
/* Indexes the words in the file */
static void printfile(SWISH * sw, char *filename) { /* Only index files once */ if ( fs_already_indexed( sw, filename ) ) return;
fprop = file_properties(filename, filename, sw);
do_index_file(sw, fprop);
free_file_properties(fprop); |
printfile 代码片段
|
printfile 代码分析
总结,通过以上的处理,核心索引之前的一些准备过程就完成了,下面就是读取文件,建立词条hash表、进行索引的过程。