public IExpression Collate(ICollation collation) { var col = Misc.TryCast <ICollation, QueryCollation>(collation); col.SetOperand(this); return(col); }
public IExpression Collate([NotNull] ICollation collation) { CBDebug.MustNotBeNull(WriteLog.To.Query, Tag, nameof(collation), collation); var col = Misc.TryCast <ICollation, QueryCollation>(collation); col = new QueryCollation(col); col.SetOperand(this); return(col); }
public int CreateCollation(IDbHandle db, ICollation collation) { var internalDbHandle = (DbHandle)db; var compareCallbackExecutor = new CompareCallbackExecutor( collation, SQLiteApiIOSInternal.GetCompareCallbackStringBytes); var func = new SQLiteApiIOSInternal.CompareCallback(compareCallbackExecutor.Execute); _allocatedGCHandles.Add(GCHandle.Alloc(func)); return(SQLiteApiIOSInternal.sqlite3_create_collation( internalDbHandle.DbPtr, Encoding.UTF8.GetBytes(collation.Name), SQLiteEncodings.SQLITE_UTF8, IntPtr.Zero, func)); }
/// -------------------------------------------------------------------------------- /// <summary> /// /// </summary> /// <param name="coll"></param> /// -------------------------------------------------------------------------------- public CollationNameMultiUnicode(ICollation coll) : base() { m_coll = coll; }
public void SerializeAndDeserialize() { IWritingSystem ws = m_wsf.get_Engine("tl"); int wsIdTl = m_wsf.GetWsFromStr("tl"); ws.Locale = 13321; ws.DefaultMonospace = "Courier New"; ws.DefaultSansSerif = "Arial"; ws.DefaultBodyFont = "Charis SIL"; ws.DefaultSerif = "Times New Roman"; ws.set_Name(m_wsIdEn, "Tagalog"); ws.set_Name(wsIdTl, "Tagalog"); ws.set_Abbr(m_wsIdEn, "TGL"); ICollation coll = CollationClass.Create(); coll.WinLCID = 1033; coll.WinCollation = "Latin1_General_CI_AI"; coll.set_Name(m_wsIdEn, "Default Collation"); coll.WritingSystemFactory = m_wsf; ws.set_Collation(0, coll); LanguageDefinition langDef = new LanguageDefinition(ws); langDef.BaseLocale = "en_US"; langDef.XmlWritingSystem.WritingSystem.IcuLocale = "tl"; langDef.LocaleName = "Tagalog"; langDef.LocaleScript = ""; langDef.LocaleCountry = ""; langDef.LocaleVariant = ""; langDef.XmlWritingSystem.WritingSystem.Locale = 13321; langDef.CollationElements = "\"& B < ..."; langDef.ValidChars = "abcdefg"; langDef.LocaleResources = @" zoneStrings { { 'Europe/London', 'Greenwich Mean Time', } }" ; CharDef[] charDefs = new CharDef[2]; charDefs[0] = new CharDef(0xF170, "COMBINING SNAKE BELOW;Mn;202;NSM;;;;"); charDefs[1] = new CharDef(0xF210, "LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;"); langDef.PuaDefinitions = charDefs; FileName[] fonts = new FileName[4]; fonts[0] = new FileName("arial.ttf"); fonts[1] = new FileName("arialbd.ttf"); fonts[2] = new FileName("ariali.ttf"); fonts[3] = new FileName("arialbi.ttf"); langDef.Fonts = fonts; langDef.Keyboard = new FileName("Tagalog.kmx"); langDef.EncodingConverter = new EncodingConverter("SIL_IPA93.tec.vbs", "SIL-IPA93.tec"); string tmpFileName = Path.GetTempFileName(); langDef.Serialize(tmpFileName); LanguageDefinitionFactory otherIcuWs = new LanguageDefinitionFactory(); LanguageDefinitionFactory.WritingSystemFactory = m_wsf; otherIcuWs.Deserialize(tmpFileName); ILanguageDefinition newLangDef = otherIcuWs.LanguageDefinition; IWritingSystem deserializedWs = newLangDef.WritingSystem; ICollation deserializedColl = newLangDef.GetCollation(0); StreamReader reader = new StreamReader(tmpFileName); string line = reader.ReadLine(); while (line != null) { Console.WriteLine(line); line = reader.ReadLine(); } reader.Close(); File.Delete(tmpFileName); Assert.AreEqual(ws.Locale, deserializedWs.Locale); Assert.AreEqual(ws.IcuLocale, deserializedWs.IcuLocale); Assert.AreEqual(ws.DefaultSansSerif, deserializedWs.DefaultSansSerif); Assert.AreEqual(ws.DefaultBodyFont, deserializedWs.DefaultBodyFont); Assert.AreEqual(ws.get_Name(m_wsIdEn), deserializedWs.get_Name(m_wsIdEn)); Assert.AreEqual(coll.WinLCID, deserializedColl.WinLCID); Assert.AreEqual(coll.WinCollation, deserializedColl.WinCollation); // ENHANCE: Add ValidChars to the interface // Assert.AreEqual(ws.ValidChars, deserializedWs.ValidChars); Assert.AreEqual(coll.get_Name(m_wsIdEn), deserializedColl.get_Name(m_wsIdEn)); }
private const string kClsid = "30"; //Collation.kclsidLgCollationString; /// ------------------------------------------------------------------------------------ /// <summary> /// C'tor /// </summary> /// <param name="coll"></param> /// ------------------------------------------------------------------------------------ public XmlCollation(ICollation coll) { m_collation = coll; }
/// -------------------------------------------------------------------------------- /// <summary> /// /// </summary> /// <param name="coll"></param> /// -------------------------------------------------------------------------------- public CollationNameMultiUnicode(ICollation coll): base() { m_coll = coll; }
public CompareCallbackExecutor(ICollation collation, Func <IntPtr, int, byte[]> compareCallbackStringBytesGetter) { _collation = collation; _compareCallbackStringBytesGetter = compareCallbackStringBytesGetter; }
public int CreateCollation(IDbHandle db, ICollation collation) { throw new NotImplementedException(); }
/// <summary> /// Get the set of significant digraphs (multigraphs) for the writing system. At the /// moment, these are derived from ICU sorting rules associated with the writing system. /// </summary> private Set <string> GetDigraphs(string sWs, out Dictionary <string, string> mapChars) { Set <string> digraphs = null; if (m_mapWsDigraphs.TryGetValue(sWs, out digraphs)) { mapChars = m_mapWsMapChars[sWs]; return(digraphs); } digraphs = new Set <string>(); mapChars = new Dictionary <string, string>(); int ws = m_cache.LanguageWritingSystemFactoryAccessor.GetWsFromStr(sWs); IWritingSystem wsX = null; ICollation coll = null; string sIcuRules = null; if (ws > 0) { wsX = m_cache.LanguageWritingSystemFactoryAccessor.get_EngineOrNull(ws); if (wsX.CollationCount > 0) { coll = wsX.get_Collation(0); sIcuRules = coll.IcuRules; if (String.IsNullOrEmpty(sIcuRules)) { // The ICU rules may not be loaded for built-in languages, but are // still helpful for our purposes here. string sIcuOrig = sIcuRules; coll.LoadIcuRules(sWs); sIcuRules = coll.IcuRules; coll.IcuRules = sIcuOrig; // but we don't want to actually change anything! } } } if (!String.IsNullOrEmpty(sIcuRules) && sIcuRules.Contains("&")) { string[] rgsRules = sIcuRules.Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < rgsRules.Length; ++i) { string sRule = rgsRules[i]; // This is a valid rule that specifies that the digraph aa should be ignored // [last tertiary ignorable] = \u02bc = aa // but the code here will ignore this. YAGNI the chances of a user specifying a digraph // as ignorable may never happen. if (sRule.Contains("[")) { sRule = sRule.Substring(0, sRule.IndexOf("[")); } if (String.IsNullOrEmpty(sRule.Trim())) { continue; } sRule = sRule.Replace("<<<", "="); sRule = sRule.Replace("<<", "="); if (sRule.Contains("<")) { // "&N<ng<<<Ng<ny<<<Ny" => "&N<ng=Ng<ny=Ny" // "&N<ñ<<<Ñ" => "&N<ñ=Ñ" // There are other issues we are not handling proplerly such as the next line // &N<\u006e\u0067 string[] rgsPieces = sRule.Split(new char[] { '<', '=' }, StringSplitOptions.RemoveEmptyEntries); for (int j = 0; j < rgsPieces.Length; ++j) { string sGraph = rgsPieces[j]; sGraph = sGraph.Trim(); if (String.IsNullOrEmpty(sGraph)) { continue; } sGraph = Icu.Normalize(sGraph, Icu.UNormalizationMode.UNORM_NFD); if (sGraph.Length > 1) { sGraph = Icu.ToLower(sGraph, sWs); if (!digraphs.Contains(sGraph)) { digraphs.Add(sGraph); } } } } else if (sRule.Contains("=")) { // "&ae<<æ<<<Æ" => "&ae=æ=Æ" string[] rgsPieces = sRule.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries); string sGraphPrimary = rgsPieces[0].Trim(); Debug.Assert(!String.IsNullOrEmpty(sGraphPrimary)); sGraphPrimary = Icu.ToLower(sGraphPrimary, sWs); for (int j = 1; j < rgsPieces.Length; ++j) { string sGraph = rgsPieces[j]; sGraph = sGraph.Trim(); if (String.IsNullOrEmpty(sGraph)) { continue; } sGraph = Icu.Normalize(sGraph, Icu.UNormalizationMode.UNORM_NFD); sGraph = Icu.ToLower(sGraph, sWs); if (sGraph != sGraphPrimary) { if (!mapChars.ContainsKey(sGraph)) { mapChars.Add(sGraph, sGraphPrimary); } } } } } } m_mapWsDigraphs.Add(sWs, digraphs); m_mapWsMapChars.Add(sWs, mapChars); return(digraphs); }