//:://///////////////////////////////////////////// //:: Name Списки //:: FileName _inc_list.nss //:: Copyright © 2004 by _kaa_ (Midgard) //::////////////////////////////////////////////// /* */ //::////////////////////////////////////////////// //:: Created By: _kaa_ //:: Created On: 06/11/2004 //:: Version : 0.9b //:://////////////////////////////////////////////
#include "_inc_cra_debug" //Функции вывода DEBUG-сообщений
const string sListPre = "_list"; //Префикс имени БД со списками const int debug = 1; //1 - включены debug-сообщениЯ по спискам
//:///////////////////////////////////////////////
//добавить запись sRecord в список sListName void _list_AddRecord(string sListName,string sRecord);
//удалить запись с номером nRecord из списка sListName void _list_DeleteRecord(string sListName,int nRecord);
//получить запись с номером nRecord из списка sListName string _list_GetRecord(string sListName,int nRecord);
//предварительное кэширование списков, //можно добавить в скрипт на событие onModuleLoad void _list_ReadList(string sListName);
//получить весь список sListName как одну строку. каждый элемент идет со своим номером string _list_GetAllAsString(string sListName);
//удалить список sListName void _list_DeleteList(string sListName);
//найти подстроку sPattern в списке sListName. //возвращает номер в списке или -1 если ничего не найдено //список нумеруетсЯ с 1 //если nLike == FALSE - используетсЯ "жесткое" сравнение //если nLike == TRUE вместо операции == используетсЯ функциЯ TestStringAgainstPattern(), котораЯ понимает ** и прочие символы. //подробнее в лексиконе по функции TestStringAgainstPattern() int _list_IsInList(string sListName,string sPattern,int nLike = FALSE);
//Упаковать базу. //Упаковка баз происходит автоматически, если число удаленных элементов составило более 50% записей. //ФункициЯ просто удалЯет старую БД и записывает в нее данные по новой, перенумеровываЯ их //Поэтому вызовать ОБЯЗАТЕЛЬНО после функций _list_ReadList() или _list_GetRecord() void _list_RepackList(string sListName);
//:///////////////////////////////////////////////
int _list_GetRecordCount(string sListName) { int result = GetLocalInt(GetModule(),sListPre+sListName+"_count"); if (result) return result; else return GetCampaignInt(sListPre+sListName,"_count"); }
void _list_SetRecordCount(string sListName,int nCount) { SetCampaignInt(sListPre+sListName,"_count",nCount); SetLocalInt(GetModule(),sListPre+sListName+"_count",nCount); }
void _list_AddRecord(string sListName,string sRecord) { int nCount = _list_GetRecordCount(sListName); nCount++; SetCampaignString(sListPre+sListName,"r"+IntToString(nCount)+"x",sRecord); SetLocalString(GetModule(),sListPre+sListName+"r"+IntToString(nCount)+"x",sRecord); _list_SetRecordCount(sListName,nCount); if (debug) WD2("LIST:ADD: ["+sListName+"] "+IntToString(nCount)+" = "+sRecord); }
void _list_DeleteRecord(string sListName,int nRecord) { DeleteCampaignVariable(sListPre+sListName,"r"+IntToString(nRecord)+"x"); DeleteLocalString(GetModule(),sListPre+sListName+"r"+IntToString(nRecord)+"x"); if (debug) WD2("LIST:DEL: ["+sListName+"] rec.num="+IntToString(nRecord));
}
void _list_RepackList(string sListName) { int nCount = _list_GetRecordCount(sListName); if (!nCount) { if (debug) WD2("LIST:REPACK: Error, empty list ["+sListName+"]"); return; } DestroyCampaignDatabase(sListPre+sListName); int k,newk=0; string sValue = ""; for (k=1;k<=nCount;k++) { sValue = GetLocalString(GetModule(),sListPre+sListName+"r"+IntToString(k)+"x"); if (sValue != "") { newk++; SetCampaignString(sListPre+sListName,"r"+IntToString(newk)+"x",sValue); if (debug) WD2("LIST:REPACK: ["+sListName+"] "+IntToString(newk)+". "+sValue); } } _list_SetRecordCount(sListName,newk); _list_ReadList(sListName); }
void _list_ReadList(string sListName) { int nCount = _list_GetRecordCount(sListName); if (!nCount) { if (debug) WD2("LIST:CACHE: empty ["+sListName+"]"); return; } int k,deleted=0; string sValue = ""; for (k=1;k<=nCount;k++) { sValue = GetCampaignString(sListPre+sListName,"r"+IntToString(k)+"x"); if (sValue != "") { SetLocalString(GetModule(),sListPre+sListName+"r"+IntToString(k)+"x",sValue); if (debug) WD2("LIST:CACHE: ["+sListName+"] "+IntToString(k)+". "+sValue); } else deleted++; } if (debug) WD2("LIST:CACHE: done. "+IntToString(deleted)+" deleted records");
if (deleted > nCount/2) _list_RepackList(sListName);
}
string _list_GetRecord(string sListName,int nRecord) { if (!_list_GetRecordCount(sListName)) _list_ReadList(sListName); return GetLocalString(GetModule(),sListPre+sListName+"r"+IntToString(nRecord)+"x"); }
string _list_GetAllAsString(string sListName) { string sResult =""; int nCount = _list_GetRecordCount(sListName); if (!nCount) { if (debug) WD2("LIST:SHOW: empty ["+sListName+"]"); return sResult; } int k; string sValue = "";
for (k=1;k<=nCount;k++) { sValue = _list_GetRecord(sListName,k); sResult += "\n"+col_green+IntToString(k)+". "+col_end+sValue; } return sResult;
}
void _list_DeleteList(string sListName) { _list_SetRecordCount(sListName,0); DestroyCampaignDatabase(sListPre+sListName); }
int _list_IsInList(string sListName,string sPattern,int nLike = FALSE) { if (debug) WD2("LIST:FIND: looking for '"+sPattern+"' in ["+sListName+"]");
if (sPattern == "") { if (debug) WD2("LIST:FIND: empty string ["+sListName+"]"); return -1; } int nCount = _list_GetRecordCount(sListName); if (!nCount) { if (debug) WD2("LIST:FIND: empty ["+sListName+"]"); return -1; } int k,result=0; string sValue = "";
for (k=1;k<=nCount;k++) { if (nLike) { result = TestStringAgainstPattern(_list_GetRecord(sListName,k),sPattern); if (debug && result) WD2("LIST:FIND: "+_list_GetRecord(sListName,k)+" LIKE "+sPattern); if (result) return result; } else { result = _list_GetRecord(sListName,k) == sPattern; if (debug && result) WD2("LIST:FIND: "+_list_GetRecord(sListName,k)+" == "+sPattern); if (result) return result; } } if (debug) WD2("LIST:FIND: not found "+sPattern+" ["+sListName+"]"); return -1;
} |