public override int CreateOrUpdate(TransitRefererHostDup instance, ManagedSecurityContext sec) { RefererHost rh = ManagedRefererHost.FindOrCreate(Session, instance.RefererHost); // merge existing dup hosts IList hosts = Session.CreateCriteria(typeof(RefererHost)) .Add(Expression.Like("Host", instance.Host)).List(); foreach (RefererHost host in hosts) { if (host != rh) { rh.Total += host.Total; Session.Delete(host); } } Session.Save(rh); return(base.CreateOrUpdate(instance, sec)); }
private void UpdateRefererHost(TransitStatsRequest request) { if (string.IsNullOrEmpty(request.RefererUri)) { return; } // don't track navigation between pages Uri requesturi = new Uri(request.RequestUri); Uri refereruri = new Uri(request.RefererUri); if (refereruri.Host == requesturi.Host) { return; } RefererHost host = (RefererHost)Session.CreateCriteria(typeof(RefererHost)) .Add(Expression.Eq("Host", refereruri.Host)) .UniqueResult(); if (host == null) { // find whether this is a dup host RefererHostDup duphost = (RefererHostDup) Session.CreateSQLQuery( "SELECT {R.*} FROM RefererHostDup {R}" + " WHERE '" + Renderer.SqlEncode(refereruri.Host) + "' LIKE Host") .AddEntity("R", typeof(RefererHostDup)) .SetMaxResults(1) .UniqueResult(); if (duphost != null) { host = duphost.RefererHost; } } if (host == null) { host = new RefererHost(); host.Created = DateTime.UtcNow; host.Host = refereruri.Host; host.Total = 0; } host.Updated = DateTime.UtcNow; // // hack: try our best to insert the host record // when an exception happens this session can't be flushed any more // if (!string.IsNullOrEmpty(request.RefererUri) && (request.RefererUri.Length < 255)) { host.LastRefererUri = request.RefererUri; } if (!string.IsNullOrEmpty(request.RequestUri) && (request.RequestUri.Length < 255)) { host.LastRequestUri = request.RequestUri; } host.Total++; try { Session.Save(host); } catch { Session.Evict(host); } }