private static RavenJToken GetValueWithDates(string val) { try { if (val.StartsWith("{")) { return(RavenJObject.Parse(val)); } if (val.StartsWith("[")) { return(RavenJArray.Parse(val)); } DateTime dateTime; if (DateTime.TryParseExact(val, Default.OnlyDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTime)) { if (val.EndsWith("Z")) { return(DateTime.SpecifyKind(dateTime, DateTimeKind.Utc)); } return(new RavenJValue(dateTime)); } DateTimeOffset dateTimeOffset; if (DateTimeOffset.TryParseExact(val, Default.DateTimeFormatsToRead, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) { return(new RavenJValue(dateTimeOffset)); } return(new RavenJValue(Uri.UnescapeDataString(val))); } catch (Exception exc) { throw new JsonReaderException(string.Concat("Unable to get value: ", val), exc); } }
private static RavenJToken GetValue(string val) { try { if (val.StartsWith("{")) { return(RavenJObject.Parse(val)); } if (val.StartsWith("[")) { return(RavenJArray.Parse(val)); } DateTime result; if (DateTime.TryParseExact(val, new[] { "r", "o" }, CultureInfo.InvariantCulture, DateTimeStyles.None, out result)) { return(new RavenJValue(result)); } return(new RavenJValue(val)); } catch (Exception exc) { throw new JsonReaderException(string.Concat("Unable to get value: ", val), exc); } }
public static IEnumerable <dynamic> GetDocumentsFromString(string json) { return(RavenJArray.Parse(json).Cast <RavenJObject>().Select(JsonToExpando.Convert)); }
/* Checks for updates and returns release informations when there is newer one. * Returns null if there is no newer release. * If Prerelease argument is true, it will return also Pre-release, otherwise Pre-releases are ignored. * An existing last checked release will be discarded. * Throws UpdaterException if error occurs. */ public static Release CheckForUpdates(bool Prerelease = true) { if (Latest != null) { if (Latest.IsDownloading) { throw new UpdaterException("Download already in progress"); } Latest.Dispose(); } Latest = null; IsChecked = IsInstalled = false; var webClient = new UpdaterWebClient(); webClient.Encoding = Encoding.UTF8; try { string json = webClient.DownloadString(GitAPILatestReleaseURL); RavenJArray releases = RavenJArray.Parse(json); if (releases.Length < 1) { throw new UpdaterException("No release found"); } string current = GetCurrentVersion(); // Current version (tag). // Iterate thru avialable releases. foreach (RavenJObject release in (RavenJArray)releases) { // Drafts are not returned by API, but just in case... bool draft = release["draft"].Value <bool>(); if (draft) { continue; // Ignore drafts. } // Check if there are assets attached. RavenJArray assets = (RavenJArray)release["assets"]; if (assets.Length < 1) { continue; // No assets, ignore it. } // Compare release tag with our version (tag). // Assumption is that no one will make realease with older version tag. // So, any different version should be newer. string tag = release["tag_name"].Value <string>(); if (tag == current) // If we didn't find different tag till now, then there is no newer version. { IsChecked = true; return(null); } // Check if it is pre-release and we want to update to it. bool prerelease = release["prerelease"].Value <bool>(); if (prerelease && !Prerelease) { continue; // Found unwanted pre-release, ignore it. } // Find PoESkillTree ZIP package. RavenJObject zipAsset = null; foreach (RavenJObject asset in assets) { string content_type = asset["content_type"].Value <string>(); if (content_type != "application/zip") { continue; // Not a ZIP, ignore it. } string name = asset["name"].Value <string>(); Match m = ReZipPackage.Match(name); if (m.Success) { // Found ZIP package. zipAsset = asset; break; } } if (zipAsset == null) { continue; // No ZIP package found. } // This is newer release (probably). IsChecked = true; Latest = new Release { Name = release["name"].Value <string>(), Description = release["body"].Value <string>(), Prerelease = prerelease, Version = tag, URI = new Uri(zipAsset["browser_download_url"].Value <string>()) }; // We are done, exit loop. break; } } catch (WebException e) { if (e.Status == WebExceptionStatus.ProtocolError) { throw new UpdaterException("HTTP " + ((int)((HttpWebResponse)e.Response).StatusCode) + " " + ((HttpWebResponse)e.Response).StatusDescription); } else { throw new UpdaterException(e.Message, e); } } catch (Exception e) { throw new UpdaterException(e.Message, e); } return(Latest); }
/* Checks for updates and returns release informations when there is newer one. * Returns null if there is no newer release. * If Prerelease argument is true, it will return also Pre-release, otherwise Pre-releases are ignored. * An existing last checked release will be discarded. * Throws UpdaterException if error occurs. */ public static Release CheckForUpdates(bool Prerelease = true) { if (Latest != null) { if (Latest.IsDownloading) { throw new UpdaterException(L10n.Message("Download already in progress")); } // If release was installed, report no update. if (Latest.IsInstalled) { return(null); } Dispose(); } if (IsNewerProductInstalled()) { // Newer product is installed, there is no update. IsChecked = true; return(null); } var webClient = new UpdaterWebClient(); webClient.Encoding = Encoding.UTF8; try { string json = webClient.DownloadString(GitAPILatestReleaseURL); RavenJArray releases = RavenJArray.Parse(json); if (releases.Length < 1) { throw new UpdaterException(L10n.Message("No release found")); } Version current = GetCurrentVersion(); // Current version (tag). // Iterate thru avialable releases. foreach (RavenJObject release in (RavenJArray)releases) { // Drafts are not returned by API, but just in case... bool draft = release["draft"].Value <bool>(); if (draft) { continue; // Ignore drafts. } // Check if there are assets attached. RavenJArray assets = (RavenJArray)release["assets"]; if (assets.Length < 1) { continue; // No assets, ignore it. } // Compare release tag with our version (tag). string tag = release["tag_name"].Value <string>(); Version version = new Version(tag); if (version.CompareTo(current) <= 0) { // Same or older version. IsChecked = true; return(null); } // Check if it is pre-release and we want to update to it. bool prerelease = release["prerelease"].Value <bool>(); if (prerelease && !Prerelease) { continue; // Found unwanted pre-release, ignore it. } // Find release package. string fileName = null; RavenJObject pkgAsset = null; foreach (RavenJObject asset in assets) { // Check if asset upload completed. if (asset["state"].Value <string>() != "uploaded") { continue; } string content_type = asset["content_type"].Value <string>(); if (content_type != PackageContentType) { continue; // Not a package, ignore it. } fileName = asset["name"].Value <string>(); Match m = RePackage.Match(fileName); if (m.Success) { // Found release package. pkgAsset = asset; break; } } if (pkgAsset == null) { continue; // No package found. } // This is newer release. IsChecked = true; Latest = new Release { Name = release["name"].Value <string>(), Description = release["body"].Value <string>(), IsPrerelease = prerelease, // A release is an update, if file name starts with our PackageName. IsUpdate = fileName.StartsWith(GetPackageName(Properties.Version.ProductName) + "-"), PackageFileName = fileName, Version = tag, URI = new Uri(pkgAsset["browser_download_url"].Value <string>()) }; // We are done, exit loop. break; } } catch (WebException e) { if (e.Status == WebExceptionStatus.ProtocolError) { throw new UpdaterException("HTTP " + ((int)((HttpWebResponse)e.Response).StatusCode) + " " + ((HttpWebResponse)e.Response).StatusDescription); } else { throw new UpdaterException(e.Message, e); } } catch (Exception e) { throw new UpdaterException(e.Message, e); } return(Latest); }
public async Task DataDumperExportHandlesMaxEtagCorrectly() { using (var store = NewDocumentStore()) { using (var session = store.OpenSession()) { for (var i = 0; i < 10; i++) { session.Store(new User { Name = "oren #" + (i + 1) }); } session.SaveChanges(); } using (var textStream = new StringWriter()) using (var writer = new JsonTextWriter(textStream)) { var dumper = new CustomDataDumper(store.SystemDatabase); var startEtag = store.SystemDatabase.Statistics.LastDocEtag.IncrementBy(-5); var endEtag = startEtag.IncrementBy(2); writer.WriteStartArray(); var lastEtag = await dumper.ExportDocuments(writer, startEtag, endEtag); writer.WriteEndArray(); writer.Flush(); // read exported content var exportedDocs = RavenJArray.Parse(textStream.GetStringBuilder().ToString()); Assert.Equal(2, exportedDocs.Count()); Assert.Equal("01000000-0000-0001-0000-000000000007", exportedDocs.First().Value <RavenJObject>("@metadata").Value <string>("@etag")); Assert.Equal("01000000-0000-0001-0000-000000000008", exportedDocs.Last().Value <RavenJObject>("@metadata").Value <string>("@etag")); Assert.Equal("01000000-0000-0001-0000-000000000008", lastEtag.ToString()); } using (var textStream = new StringWriter()) using (var writer = new JsonTextWriter(textStream)) { var dumper = new CustomDataDumper(store.SystemDatabase); var startEtag = store.SystemDatabase.Statistics.LastDocEtag.IncrementBy(-5); writer.WriteStartArray(); var lastEtag = await dumper.ExportDocuments(writer, startEtag, null); writer.WriteEndArray(); writer.Flush(); // read exported content var exportedDocs = RavenJArray.Parse(textStream.GetStringBuilder().ToString()); Assert.Equal(5, exportedDocs.Count()); Assert.Equal("01000000-0000-0001-0000-000000000007", exportedDocs.First().Value <RavenJObject>("@metadata").Value <string>("@etag")); Assert.Equal("01000000-0000-0001-0000-00000000000B", exportedDocs.Last().Value <RavenJObject>("@metadata").Value <string>("@etag")); Assert.Equal("01000000-0000-0001-0000-00000000000B", lastEtag.ToString()); } for (var i = 0; i < 10; i++) { store.DatabaseCommands.PutAttachment("attach/" + (i + 1), null, new MemoryStream(new [] { (byte)i }), new RavenJObject()); } using (var textStream = new StringWriter()) using (var writer = new JsonTextWriter(textStream)) { var dumper = new CustomDataDumper(store.SystemDatabase); var startEtag = store.SystemDatabase.Statistics.LastAttachmentEtag.IncrementBy(-5); var endEtag = startEtag.IncrementBy(2); writer.WriteStartArray(); var lastEtag = await dumper.ExportAttachments(writer, startEtag, endEtag); writer.WriteEndArray(); writer.Flush(); // read exported content var exportedAttachments = RavenJArray.Parse(textStream.GetStringBuilder().ToString()); Assert.Equal(2, exportedAttachments.Count()); Assert.Equal("02000000-0000-0001-0000-000000000006", exportedAttachments.First().Value <string>("Etag")); Assert.Equal("02000000-0000-0001-0000-000000000007", exportedAttachments.Last().Value <string>("Etag")); Assert.Equal("02000000-0000-0001-0000-000000000007", lastEtag.ToString()); } using (var textStream = new StringWriter()) using (var writer = new JsonTextWriter(textStream)) { var dumper = new CustomDataDumper(store.SystemDatabase); var startEtag = store.SystemDatabase.Statistics.LastAttachmentEtag.IncrementBy(-5); writer.WriteStartArray(); var lastEtag = await dumper.ExportAttachments(writer, startEtag, null); writer.WriteEndArray(); writer.Flush(); // read exported content var exportedAttachments = RavenJArray.Parse(textStream.GetStringBuilder().ToString()); Assert.Equal(5, exportedAttachments.Count()); Assert.Equal("02000000-0000-0001-0000-000000000006", exportedAttachments.First().Value <string>("Etag")); Assert.Equal("02000000-0000-0001-0000-00000000000A", exportedAttachments.Last().Value <string>("Etag")); Assert.Equal("02000000-0000-0001-0000-00000000000A", lastEtag.ToString()); } WaitForIndexing(store); store.DatabaseCommands.DeleteByIndex("Raven/DocumentsByEntityName", new IndexQuery() { Query = "Tag:Users" }).WaitForCompletion(); for (var i = 0; i < 10; i++) { store.DatabaseCommands.DeleteAttachment("attach/" + (i + 1), null); } Etag user6DeletionEtag = null, user9DeletionEtag = null, attach5DeletionEtag = null, attach7DeletionEtag = null; WaitForUserToContinueTheTest(store); store.SystemDatabase.TransactionalStorage.Batch(accessor => { user6DeletionEtag = accessor.Lists.Read(Constants.RavenPeriodicExportsDocsTombstones, "users/6").Etag; user9DeletionEtag = accessor.Lists.Read(Constants.RavenPeriodicExportsDocsTombstones, "users/9").Etag; attach5DeletionEtag = accessor.Lists.Read(Constants.RavenPeriodicExportsAttachmentsTombstones, "attach/5").Etag; attach7DeletionEtag = accessor.Lists.Read(Constants.RavenPeriodicExportsAttachmentsTombstones, "attach/7").Etag; }); using (var textStream = new StringWriter()) using (var writer = new JsonTextWriter(textStream)) { var dumper = new CustomDataDumper(store.SystemDatabase); writer.WriteStartObject(); var lastEtags = new LastEtagsInfo(); var exportResult = new ExportDataResult { LastDocDeleteEtag = user6DeletionEtag, LastAttachmentsDeleteEtag = attach5DeletionEtag }; lastEtags.LastDocDeleteEtag = user9DeletionEtag; lastEtags.LastAttachmentsDeleteEtag = attach7DeletionEtag; dumper.ExportDeletions(writer, exportResult, lastEtags).Wait(); writer.WriteEndObject(); writer.Flush(); // read exported content var exportJson = RavenJObject.Parse(textStream.GetStringBuilder().ToString()); var docsKeys = exportJson.Value <RavenJArray>("DocsDeletions").Select(x => x.Value <string>("Key")).ToArray(); var attachmentsKeys = exportJson.Value <RavenJArray>("AttachmentsDeletions") .Select(x => x.Value <string>("Key")) .ToArray(); Assert.Equal(new [] { "users/7", "users/8", "users/9" }, docsKeys); Assert.Equal(new [] { "attach/6", "attach/7" }, attachmentsKeys); } } }
/* Checks for updates and returns release informations when there is newer one. * Returns null if there is no newer release. * An existing last checked release will be discarded. * Throws UpdaterException if error occurs. */ public static Release CheckForUpdates() { if (Latest != null) { if (Latest.IsDownloading) { throw new UpdaterException("Download already in progress"); } Latest.Dispose(); } Latest = null; IsChecked = IsInstalled = false; var webClient = new UpdaterWebClient(); webClient.Encoding = Encoding.UTF8; try { string json = webClient.DownloadString(GitAPILatestReleaseURL); RavenJArray releases = RavenJArray.Parse(json); if (releases.Length < 1) { throw new UpdaterException("No release found"); } RavenJObject latest = (RavenJObject)releases[0]; RavenJArray assets = (RavenJArray)latest["assets"]; if (assets.Length < 1) { throw new UpdaterException("Package for release is missing"); } string current = GetCurrentVersion(); string tag = latest["tag_name"].Value <string>(); if (tag == current) { IsChecked = true; return(null); } string url = ((RavenJObject)assets[0])["browser_download_url"].Value <string>(); IsChecked = true; Latest = new Release { Name = latest["name"].Value <string>(), Description = latest["body"].Value <string>(), Version = tag, URI = new Uri(url) }; } catch (WebException e) { if (e.Status == WebExceptionStatus.ProtocolError) { throw new UpdaterException("HTTP " + ((int)((HttpWebResponse)e.Response).StatusCode) + " " + ((HttpWebResponse)e.Response).StatusDescription); } else { throw new UpdaterException(e.Message, e); } } catch (Exception e) { throw new UpdaterException(e.Message, e); } return(Latest); }