pike.git / lib / modules / Search.pmod / Utils.pmod

version» Context lines:

pike.git/lib/modules/Search.pmod/Utils.pmod:1:   // This file is part of Roxen Search   // Copyright © 2001 Roxen IS. All rights reserved.   // - // $Id: Utils.pmod,v 1.26 2001/08/16 21:22:32 nilsson Exp $ + // $Id: Utils.pmod,v 1.27 2001/08/19 14:34:52 nilsson Exp $      #if !constant(report_error)   #define report_error werror   #endif      public array(string) tokenize_and_normalize( string what )   //! This can be optimized quite significantly when compared to   //! tokenize( normalize( x ) ) in the future, currently it's not all   //! that much faster, but still faster.   {
pike.git/lib/modules/Search.pmod/Utils.pmod:32:         #define THROW(X) throw( ({ (X), backtrace() }) )      //! A result entry from the @[ProfileCache].   class ProfileEntry {       private int last_stat;       private int database_profile_id; -  private int search_profile_id; +  private int query_profile_id;    private ProfileCache my_cache;       private mapping(string:mixed) database_values; -  private mapping(string:mixed) search_values; +  private mapping(string:mixed) query_values;       private Search.Database.MySQL db;    private Search.RankingProfile ranking;    private array(string) stop_words;    -  //! @decl void create(int database_profile_id, int search_profile_id,@ +  //! @decl void create(int database_profile_id, int query_profile_id,@    //! ProfileCache cache)    //! @param cache    //! The parent cache object.    void create(int _database_profile_id, -  int _search_profile_id, +  int _query_profile_id,    ProfileCache _my_cache) {    database_profile_id = _database_profile_id; -  search_profile_id = _search_profile_id; +  query_profile_id = _query_profile_id;    my_cache = _my_cache;    int last_stat = time(1);       // Prefetch..    get_ranking();    }       //! Checks if it is time to check if the profile values are    //! to old.    int(0..1) check_timeout() {
pike.git/lib/modules/Search.pmod/Utils.pmod:73:    return 1;    }       //! Returns the database profile value @[index].    mixed get_database_value(string index) {    if(!database_values)    database_values = my_cache->get_value_mapping(database_profile_id);    return database_values[index];    }    -  //! Returns the search profile value @[index]. -  mixed get_search_value(string index) { -  if(!search_values) -  search_values = my_cache->get_value_mapping(search_profile_id); -  return search_values[index]; +  //! Returns the query profile value @[index]. +  mixed get_query_value(string index) { +  if(!query_values) +  query_values = my_cache->get_value_mapping(query_profile_id); +  return query_values[index];    }       //! Returns a cached search database for the current database profile.    Search.Database.MySQL get_database() {    if(!db) {   #if constant(DBManager)    db = Search.Database.MySQL( DBManager.db_url( get_database_value("db_name"), 1) );   #endif    if(!db)    THROW("Could not aquire the database URL to database " +    get_database_value("db_name") + ".\n");    }    return db;    }       //! Returns a cached ranking profile for the current database and -  //! search profile. +  //! query profile.    Search.RankingProfile get_ranking() {    if(!ranking) -  ranking = Search.RankingProfile(get_search_value("fi_cut"), -  get_search_value("px_rank"), +  ranking = Search.RankingProfile(get_query_value("fi_cut"), +  get_query_value("px_rank"),    get_database(), -  get_search_value("fi_rank")); +  get_query_value("fi_rank"));    return ranking;    }       class ADTSet {    private mapping vals = ([]);       ADTSet add (string|int|float in) {    vals[in] = 1;    return this_object();    }
pike.git/lib/modules/Search.pmod/Utils.pmod:144:    switch(to) {    case "object": return this_object();    case "array": return indices(vals);    case "multiset": return (multiset)indices(vals);    default:    THROW("Can not cast ADTSet to "+to+".\n");    }    }    }    -  //! Returns a cached array of stop words for the current search profile. +  //! Returns a cached array of stop words for the current query profile.    array(string) get_stop_words() {    if(!stop_words) {    ADTSet words = ADTSet(); -  foreach(get_search_value("sw_lists"), string fn) { +  foreach(get_query_value("sw_lists"), string fn) {    string file = Stdio.read_file(fn);    if(!fn)    report_error("Could not load %O.\n", fn);    else    words + (Array.flatten(map(file/"\n",    lambda(string in) {    return in/" ";    }))-({""}));    } -  words + (Array.flatten(map(get_search_value("sw_words")/"\n", +  words + (Array.flatten(map(get_query_value("sw_words")/"\n",    lambda(string in) {    return in/" ";    }))-({""}));    stop_words = (array)words;    }    return stop_words;    }   }      //!   class ProfileCache (string db_name) {       private mapping(string:ProfileEntry) entry_cache = ([]);    private mapping(int:mapping(string:mixed)) value_cache = ([]);    private mapping(string:int) db_profile_names = ([]); -  private mapping(string:int) srh_profile_names = ([]); +  private mapping(string:int) query_profile_names = ([]);    private mapping(int:int) profile_stat = ([]);       private Sql.Sql get_db() {    Sql.Sql db;   #if constant(DBManager)    db = DBManager.cached_get(db_name);   #endif    if(!db) THROW("Could not connect to database " + db_name + ".\n");    return db;    }
pike.git/lib/modules/Search.pmod/Utils.pmod:212:    // The profile is deleted. In such a rare event we take the    // trouble to review all our cached values.    if(!sizeof(res)) {    array(int) existing = (array(int))get_db()->query("SELECT id FROM wf_profile")->id;       foreach(indices(value_cache), int id)    if(!has_value(existing, id))    m_delete(value_cache, id);       foreach(indices(entry_cache), string id) { -  int dbp, srhp; -  sscanf(id, "%d:%d", dbp, srhp); +  int dbp, qp; +  sscanf(id, "%d:%d", dbp, qp);    if(!has_value(existing, dbp))    m_delete(entry_cache, id); -  if(!has_value(existing, srhp)) +  if(!has_value(existing, qp))    m_delete(entry_cache, id);    }       foreach(indices(db_profile_names), string name)    if(!has_value(existing, db_profile_names[name]))    m_delete(db_profile_names, name);    -  foreach(indices(srh_profile_names), string name) -  if(!has_value(existing, srh_profile_names[name])) -  m_delete(srh_profile_names, name); +  foreach(indices(query_profile_names), string name) +  if(!has_value(existing, query_profile_names[name])) +  m_delete(query_profile_names, name);       return -1;    }       // Not altered    if((int)res[0]->altered == profile_stat[profile_id]) return 1;    profile_stat[profile_id] = (int)res[0]->altered;    -  // Search profile +  // Query profile    if((int)res[0]->type == 2)    {    m_delete(value_cache, profile_id);    foreach(indices(entry_cache), string id)    if(array_sscanf(id, "%d:%d")[1]==profile_id)    m_delete(entry_cache, id);    return 0;    }       m_delete(value_cache, profile_id);
pike.git/lib/modules/Search.pmod/Utils.pmod:266:    return db_profile;       array res = get_db()->    query("SELECT id FROM wf_profile WHERE name=%s AND type=2", name);    if(!sizeof(res))    THROW("No database profile " + name + " found.\n");       return db_profile_names[name] = (int)res[0]->id;    }    -  //! Returns the profile number for the given search profile. -  int get_srh_profile_number(string name) +  //! Returns the profile number for the given query profile. +  int get_query_profile_number(string name)    { -  int srh_profile; -  if( srh_profile=srh_profile_names[name] ) -  return srh_profile; +  int query_profile; +  if( query_profile=query_profile_names[name] ) +  return query_profile;       array res = get_db()->    query("SELECT id FROM wf_profile WHERE name=%s AND type=1", name);    if(!sizeof(res)) -  THROW("No search profile " + name + " found.\n"); +  THROW("No query profile " + name + " found.\n");    -  return srh_profile_names[name] = (int)res[0]->id; +  return query_profile_names[name] = (int)res[0]->id;    }       private int last_db_prof_stat = 0; // 1970       //! Returns a list of available database profiles.    array(string) list_db_profiles() {    if (time(1) - last_db_prof_stat < 5*60)    return indices(db_profile_names);    array res = get_db()->query("SELECT name, id FROM wf_profile WHERE type=2");    db_profile_names = mkmapping(    res->name,    map(res->id, lambda(string s) { return (int) s; } ));    if(sizeof(res))    last_db_prof_stat = time(1);    return res->name;    }    -  private int last_srh_prof_stat = 0; // 1970 +  private int last_query_prof_stat = 0; // 1970    -  //! Returns a list of available search profiles. -  array(string) list_srh_profiles() +  //! Returns a list of available query profiles. +  array(string) list_query_profiles()    { -  if (time(1) - last_srh_prof_stat >= 5*60) { +  if (time(1) - last_query_prof_stat >= 5*60) {    array res = get_db()->query("SELECT name, id FROM wf_profile WHERE type=1"); -  srh_profile_names = mkmapping( res->name, (array(int)) res->id ); -  if(sizeof(srh_profile_names)) -  last_srh_prof_stat = time(1); +  query_profile_names = mkmapping( res->name, (array(int)) res->id ); +  if(sizeof(query_profile_names)) +  last_query_prof_stat = time(1);    } -  return indices(srh_profile_names); +  return indices(query_profile_names);    }       // Used when decoding text encoded pike data types.    private object compile_handler = class {    mapping(string:mixed) get_default_module() {    return ([ "aggregate_mapping":aggregate_mapping,    "aggregate_multiset":aggregate_multiset,    "aggregate":aggregate,    "allocate":allocate,    "this_program":0 ]);
pike.git/lib/modules/Search.pmod/Utils.pmod:349:    array res = get_db()->    query("SELECT name,value FROM wf_value WHERE pid=%d", profile);       val = mkmapping( res->name, map(res->value, reacodec_decode) );    value_cache[profile] = copy_value(val);    return val;    }       //! Returns a @[ProfileEntry] object with the states needed for    //! commiting searches in the database profile @[db_name] with -  //! the rules from search profile @[srh_name]. -  ProfileEntry get_profile_entry(string db_name, void|string srh_name) { +  //! the rules from query profile @[query_name]. +  ProfileEntry get_profile_entry(string db_name, void|string query_name) {    // werror("Entry: %O\n", indices(entry_cache));    // werror("Value: %O\n", indices(value_cache));    // werror("Stat : %O\n", profile_stat);       int db = get_db_profile_number(db_name); -  int srh = get_srh_profile_number(srh_name); +  int query = get_query_profile_number(query_name);       ProfileEntry entry; -  if(entry=entry_cache[srh +":"+ db]) { +  if(entry=entry_cache[query +":"+ db]) {    if(!entry->check_timeout()) return entry;    if(up_to_datep(db) && -  up_to_datep(srh)) return entry; +  up_to_datep(query)) return entry;    }    -  entry = ProfileEntry( db, srh, this_object() ); -  return entry_cache[srh +":"+ db] = entry; +  entry = ProfileEntry( db, query, this_object() ); +  return entry_cache[query +":"+ db] = entry;    }       //! Flushes profile entry @[p] from the profile cache.    void flush_profile(int p) {    m_delete(value_cache, p);    foreach(indices(db_profile_names), string name)    if(db_profile_names[name]==p)    m_delete(db_profile_names, name); -  m_delete(srh_profile_names, p); +  m_delete(query_profile_names, p);    foreach(indices(entry_cache), string id) {    array ids = array_sscanf(id, "%d:%d");    if(ids[0]==p || ids[1]==p)    m_delete(entry_cache, id);    }    }       //! Empty the whole cache.    void flush_cache() {    value_cache = ([]);    db_profile_names = ([]); -  srh_profile_names = ([]); +  query_profile_names = ([]);    }   }      private mapping(string:ProfileCache) profile_cache_cache = ([]);      ProfileCache get_profile_cache(string db_name) {    if(profile_cache_cache[db_name])    return profile_cache_cache[db_name];    return profile_cache_cache[db_name] = ProfileCache(db_name);   }