Changeset 14277 for lang/python

Show
Ignore:
Timestamp:
06/20/08 07:06:24 (5 months ago)
Author:
ayu
Message:
  • added non-blocking search function
Location:
lang/python/incsearch
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • lang/python/incsearch/include/DocDb.h

    r14274 r14277  
    2424  DocDbReader(const std::string& dbname); 
    2525  ~DocDbReader(); 
     26  //検索関数 
    2627  void find(const std::string& searchstr, std::vector<std::string>& answer); 
     28  //検索関数(排他しない版) 
     29  void find_dangerous(const std::string& searchstr, std::vector<std::string>& answer); 
    2730}; 
    2831 
  • lang/python/incsearch/incsearch/indexer.py

    r14238 r14277  
    33# Copyright (C)  2007 Ayukawa Hiroshi 
    44import os.path 
     5import re 
     6import glob 
     7from  incsearch.db import DocDbWriter 
    58 
    6 def createindex(globber, extractor, outdirbase): 
     9FUNC = re.compile(r'<tt id[^>]*>([^<]+)</tt>') 
     10def extractor(cont): 
     11    scanner = FUNC.scanner(cont) 
     12    m = scanner.search() 
     13    while m: 
     14        yield dict(pos=m.start(), title=m.group(1), word=m.group(1)) 
     15        m = scanner.search() 
     16 
     17def globber(pat, base=""): 
     18    for f in  glob.glob(pat): 
     19        if f.startswith(base): 
     20            yield f[len(base):] 
     21        else: 
     22            yield f 
     23 
     24def createindex(dbfile, globber, outdirbase, extractor=extractor): 
     25    u""" 
     26    extractor  ファイル内の情報列を返す。dict(pos=出現文字位置, title=タイトル) 
     27    """ 
     28    db = DocDbWriter(dbfile) 
    729    for fname in globber: 
    830        #内容を読み込む 
     31        print "fname", fname 
    932        fp = file(fname) 
    1033        whole = fp.read() 
     
    2043        tagged = [] 
    2144        pre = 0 
    22         for i, ipoint in enumerate(extractor(whole)):  #TODO:  ここで後でindex構築のためのデータ保存 
     45        for i, ipoint in enumerate(extractor(whole)): 
     46            ipoint.update({"fname": fname}) 
     47            db.put(ipoint["word"], "%s\t%d\t%s" % (fname, ipoint["pos"], ipoint["title"])) 
    2348            nametag = "<a name='incsearch_%d'/>" % i 
    24             tagged.append(whole[pre:i]) 
     49            tagged.append(whole[pre:ipoint["pos"]]) 
    2550            tagged.append(nametag) 
    26             pre = i 
     51            pre = ipoint["pos"] 
    2752        tagged.append(whole[pre:]) 
    2853        gp = file(os.path.join(outdir, os.path.basename(fname)), "w") 
     
    3257 
    3358def test(): 
    34     pass 
     59    createindex("testdb", globber("data/lib/*"), "data/index") 
    3560 
    3661def main(): 
  • lang/python/incsearch/src/DocDb.cpp

    r14274 r14277  
    5757    } 
    5858  } 
     59  void DocDbReader::find_dangerous(const std::string& searchstr, std::vector<std::string>& answer){ 
     60    //一文字だと多いので何もしません。 
     61    if(searchstr.size() < 2) return; 
     62 
     63    try{  
     64      //排他なし! 
     65 
     66      // カーソルを候補の先頭に置く 
     67      villa.curjump(searchstr.c_str(), searchstr.size()+1); 
     68      // カーソルを走査する 
     69      for(;;){ 
     70        char* key = villa.curkey(); 
     71        if(strstr(key, searchstr.c_str()) != key){ 
     72          free(key); 
     73          break; 
     74        } 
     75        char* val = villa.curval(); 
     76        std::string a = key; 
     77        a.append("\t"); 
     78        a.append(val); 
     79        answer.push_back(a); 
     80        free(key); 
     81        free(val); 
     82        villa.curnext(); 
     83      } 
     84    }catch(qdbm::Villa_error& e){ 
     85      if(e.code() != qdbm::Villa::ENOITEM) throw e; 
     86    } 
     87  } 
    5988 
    6089}