bingo/sqlserver/Source/RingoShadowFetch.cs (99 lines of code) (raw):

using System.IO; using System; using System.Collections.Generic; using System.Collections; using System.Text; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using System.Globalization; namespace indigo { public class RingoShadowFetch { RingoIndexData _index_data; enum SearchType { UNDEF, EXACT }; SearchType search_type = SearchType.UNDEF; string where_clause; public int? nextAfterStorageId { get; set; } public RingoShadowFetch (RingoIndexData index_data) { _index_data = index_data; } public void prepareExact (string query, string options) { int res = BingoCore.lib.ringoSetupMatch("REXACT", query, options); if (res < 0) throw new Exception(BingoCore.lib.bingoGetError()); int query_hash; BingoCore.lib.ringoGetHash(false, out query_hash); where_clause = String.Format("hash = {0}", query_hash); search_type = SearchType.EXACT; } public IEnumerable<FetchedData> fetch (SqlConnection conn) { ArrayList res_list = new ArrayList(); StringBuilder command_text = new StringBuilder(); command_text.Append("SELECT sh.id"); if (search_type == SearchType.EXACT) { command_text.Append(", sh.crf"); } command_text.AppendFormat(" FROM {0} sh", _index_data.shadowTable); StringBuilder final_where_clause = new StringBuilder(); if (where_clause.Length > 0) { final_where_clause.Append(" ( "); final_where_clause.Append(where_clause); final_where_clause.Append(" ) "); } if (nextAfterStorageId != null) { if (final_where_clause.Length > 0) final_where_clause.Append(" and "); final_where_clause.Append(" ("); final_where_clause.AppendFormat(" storage_id > {0} ", nextAfterStorageId.Value); final_where_clause.Append(" )"); } if (final_where_clause.Length > 0) { command_text.Append(" WHERE "); command_text.Append(final_where_clause.ToString()); } if (nextAfterStorageId.HasValue) command_text.Append(" ORDER BY storage_id"); UTF8Encoding encoding = new UTF8Encoding(); using (SqlCommand cmd = new SqlCommand(command_text.ToString(), conn)) { cmd.CommandTimeout = 3600; using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { int id = Convert.ToInt32(reader[0]); int res; if (search_type == SearchType.EXACT) { byte[] crf = (byte[])reader[1]; res = BingoCore.lib.ringoMatchTargetBinary(crf, crf.Length); } else throw new Exception("Search type is undefined"); if (res == -2) throw new Exception(BingoCore.lib.bingoGetError()); if (res == -1) throw new Exception(BingoCore.lib.bingoGetWarning()); if (res == 1) { FetchedData data = new FetchedData(id); yield return data; } } } } } } }