public DnsTransaction.ResourceRecord lookup(DnsTransaction.QuestionRecord record) { uint qid = getDnsQueryId(record); using (MySqlCommand sql = new MySqlCommand("SELECT (ttl,data) FROM records WHERE query=@query ORDER BY cached DESC LIMIT 1", db)) { sql.Parameters.AddWithValue("@query", qid); sql.Prepare(); using (MySqlDataReader results = sql.ExecuteReader()) { byte[] chunk = new byte[1024]; long n = 0; long r; MemoryStream s = new MemoryStream(); do { r = results.GetBytes(1, n, chunk, 0, chunk.Length); s.Write(chunk, 0, (int)r); } while(r == chunk.Length); return(new DnsTransaction.ResourceRecord(record, results.GetUInt32(0), s.ToArray())); } } }
public uint getDnsQueryId(DnsTransaction.QuestionRecord query, uint labelId = 0) { if (labelId == 0) { labelId = getDnsLabelId(query.name); } MySqlCommand sql = new MySqlCommand("SELECT (id) FROM queries WHERE label=@label AND type=@type AND class=@class LIMIT 1", db); sql.Parameters.AddWithValue("@label", labelId.ToString()); sql.Parameters.AddWithValue("@type", (uint)query._type); sql.Parameters.AddWithValue("@class", (uint)query._class); sql.Prepare(); object r = sql.ExecuteScalar(); if (r != null) { return((uint)r); } // Doesn't Exist, lets create sql.CommandText = "INSERT INTO queries (label,type,class) VALUES (@label,@type,@class)"; sql.Prepare(); sql.ExecuteNonQuery(); return((uint)sql.LastInsertedId); }
public DnsTask(DnsTransaction.QuestionRecord question) { this.resolver = new DnsTransaction(1, new DnsTransaction.DnsFlags(0x0100), question); }