private IPackage ReadPackage(JToken package, NodeModuleBuilder builder) { builder.Reset(); try { builder.Name = (string)package["name"]; if (string.IsNullOrEmpty(builder.Name)) { // I don't believe this should ever happen if the data returned is // well formed. Could throw an exception, but just skip instead for // resiliency on the NTVS side. return(null); } builder.AppendToDescription((string)package["description"] ?? string.Empty); var date = package["date"]; if (date != null) { builder.SetDate((string)date); } var version = package["version"]; if (version != null) { var semver = SemverVersion.Parse((string)version); builder.AddVersion(semver); } AddKeywords(builder, package["keywords"]); AddAuthor(builder, package["author"]); AddHomepage(builder, package["links"]); return(builder.Build()); } catch (InvalidOperationException) { // Occurs if a JValue appears where we expect JProperty return(null); } catch (ArgumentException) { return(null); } }
private IPackage ReadPackage(JsonTextReader jsonReader, NodeModuleBuilder builder) { IPackage package = null; builder.Reset(); try { // The JsonTextReader should be positioned at the start of the // object literal token for the package var module = JToken.ReadFrom(jsonReader); builder.Name = (string)module["name"]; if (string.IsNullOrEmpty(builder.Name)) { // I don't believe this should ever happen if the data returned is // well formed. Could throw an exception, but just skip instead for // resiliency on the NTVS side. return(null); } builder.AppendToDescription((string)module["description"] ?? string.Empty); var time = module["time"]; if (time != null) { builder.AppendToDate((string)time["modified"]); } var distTags = module["dist-tags"]; if (distTags != null) { var latestVersion = distTags .OfType <JProperty>() .Where(v => (string)v.Name == "latest") .Select(v => (string)v.Value) .FirstOrDefault(); if (!string.IsNullOrEmpty(latestVersion)) { try { builder.LatestVersion = SemverVersion.Parse(latestVersion); } catch (SemverVersionFormatException) { OnOutputLogged(String.Format( Resources.InvalidPackageSemVersion, latestVersion, builder.Name)); } } } var versions = module["versions"]; if (versions != null) { builder.AvailableVersions = GetVersions(versions); } AddKeywords(builder, module["keywords"]); AddAuthor(builder, module["author"]); AddHomepage(builder, module["homepage"]); package = builder.Build(); } catch (InvalidOperationException) { // Occurs if a JValue appears where we expect JProperty return(null); } catch (ArgumentException) { OnOutputLogged(string.Format(Resources.ParsingError, builder.Name)); return(null); } return(package); }
private IPackage ReadPackage(JsonTextReader jsonReader, NodeModuleBuilder builder) { IPackage package = null; builder.Reset(); try { // The JsonTextReader should be positioned at the start of the // object literal token for the package var module = JToken.ReadFrom(jsonReader); builder.Name = (string)module["name"]; if (string.IsNullOrEmpty(builder.Name)) { // I don't believe this should ever happen if the data returned is // well formed. Could throw an exception, but just skip instead for // resiliency on the NTVS side. return null; } builder.AppendToDescription((string)module["description"] ?? string.Empty); var time = module["time"]; if (time != null) { builder.AppendToDate((string)time["modified"]); } var distTags = module["dist-tags"]; if (distTags != null) { var latestVersion = distTags .OfType<JProperty>() .Where(v => (string)v.Name == "latest") .Select(v => (string)v.Value) .FirstOrDefault(); if (!string.IsNullOrEmpty(latestVersion)) { try { builder.LatestVersion = SemverVersion.Parse(latestVersion); } catch (SemverVersionFormatException) { OnOutputLogged(String.Format( Resources.InvalidPackageSemVersion, latestVersion, builder.Name)); } } } var versions = module["versions"]; if (versions != null) { builder.AvailableVersions = GetVersions(versions); } AddKeywords(builder, module["keywords"]); AddAuthor(builder, module["author"]); AddHomepage(builder, module["homepage"]); package = builder.Build(); } catch (InvalidOperationException) { // Occurs if a JValue appears where we expect JProperty return null; } catch (ArgumentException) { OnOutputLogged(string.Format(Resources.ParsingError, builder.Name)); return null; } return package; }
internal void ParseResultsAndAddToDatabase(TextReader reader, string dbFilename, string registryUrl) { Directory.CreateDirectory(Path.GetDirectoryName(dbFilename)); using (var db = new SQLiteConnection(dbFilename)) { db.RunInTransaction(() => { db.CreateRegistryTableIfNotExists(); using (var jsonReader = new JsonTextReader(reader)) { while (jsonReader.Read()) { if (JsonToken.PropertyName != jsonReader.TokenType) { continue; } if ((string)jsonReader.Value == "_updated") { jsonReader.Read(); db.InsertOrReplace(new RegistryInfo() { RegistryUrl = registryUrl, Revision = (long)jsonReader.Value, UpdatedOn = DateTime.Now }); continue; } var builder = new NodeModuleBuilder(); JToken token = null; #if DEV14_OR_LATER try { #endif token = JToken.ReadFrom(jsonReader); #if DEV14_OR_LATER } catch (JsonReaderException) { // Reached end of file, so continue. break; } #endif var module = token.FirstOrDefault(); while (module != null) { try { builder.Name = (string)module["name"]; if (string.IsNullOrEmpty(builder.Name)) { continue; } builder.AppendToDescription((string)module["description"] ?? string.Empty); var time = module["time"]; if (time != null) { builder.AppendToDate((string)time["modified"]); } var distTags = module["dist-tags"]; if (distTags != null) { var latestVersion = distTags .OfType<JProperty>() .Where(v => (string)v.Name == "latest") .Select(v => (string)v.Value) .FirstOrDefault(); if (!string.IsNullOrEmpty(latestVersion)) { try { builder.LatestVersion = SemverVersion.Parse(latestVersion); } catch (SemverVersionFormatException) { OnOutputLogged(String.Format(Resources.InvalidPackageSemVersion, latestVersion, builder.Name)); } } } var versions = module["versions"]; if (versions != null) { builder.AvailableVersions = GetVersions(versions); } AddKeywords(builder, module["keywords"]); AddAuthor(builder, module["author"]); AddHomepage(builder, module["homepage"]); var package = builder.Build(); InsertCatalogEntry(db, package); } catch (InvalidOperationException) { // Occurs if a JValue appears where we expect JProperty } catch (ArgumentException) { OnOutputLogged(string.Format(Resources.ParsingError, builder.Name)); if (!string.IsNullOrEmpty(builder.Name)) { var package = builder.Build(); InsertCatalogEntry(db, package); } } builder.Reset(); #if DEV14_OR_LATER try { #endif token = JToken.ReadFrom(jsonReader); #if DEV14_OR_LATER } catch (JsonReaderException) { // Reached end of file, so continue. break; } #endif module = token.FirstOrDefault(); } } } // FTS doesn't support INSERT OR REPLACE. This is the most efficient way to bypass that limitation. db.Execute("DELETE FROM CatalogEntry WHERE docid NOT IN (SELECT MAX(docid) FROM CatalogEntry GROUP BY Name)"); }); } }
internal void ParseResultsAndAddToDatabase(TextReader reader, string dbFilename, string registryUrl) { Directory.CreateDirectory(Path.GetDirectoryName(dbFilename)); using (var db = new SQLiteConnection(dbFilename)) { db.RunInTransaction(() => { db.CreateRegistryTableIfNotExists(); using (var jsonReader = new JsonTextReader(reader)) { while (jsonReader.Read()) { if (JsonToken.PropertyName != jsonReader.TokenType) { continue; } if ((string)jsonReader.Value == "_updated") { jsonReader.Read(); db.InsertOrReplace(new RegistryInfo() { RegistryUrl = registryUrl, Revision = (long)jsonReader.Value, UpdatedOn = DateTime.Now }); continue; } var builder = new NodeModuleBuilder(); JToken token = null; #if DEV14_OR_LATER try { #endif token = JToken.ReadFrom(jsonReader); #if DEV14_OR_LATER } catch (JsonReaderException) { // Reached end of file, so continue. break; } #endif var module = token.FirstOrDefault(); while (module != null) { try { builder.Name = (string)module["name"]; if (string.IsNullOrEmpty(builder.Name)) { continue; } builder.AppendToDescription((string)module["description"] ?? string.Empty); var time = module["time"]; if (time != null) { builder.AppendToDate((string)time["modified"]); } var distTags = module["dist-tags"]; if (distTags != null) { var latestVersion = distTags .OfType <JProperty>() .Where(v => (string)v.Name == "latest") .Select(v => (string)v.Value) .FirstOrDefault(); if (!string.IsNullOrEmpty(latestVersion)) { try { builder.LatestVersion = SemverVersion.Parse(latestVersion); } catch (SemverVersionFormatException) { OnOutputLogged(String.Format(Resources.InvalidPackageSemVersion, latestVersion, builder.Name)); } } } var versions = module["versions"]; if (versions != null) { builder.AvailableVersions = GetVersions(versions); } AddKeywords(builder, module["keywords"]); AddAuthor(builder, module["author"]); AddHomepage(builder, module["homepage"]); var package = builder.Build(); InsertCatalogEntry(db, package); } catch (InvalidOperationException) { // Occurs if a JValue appears where we expect JProperty } catch (ArgumentException) { OnOutputLogged(string.Format(Resources.ParsingError, builder.Name)); if (!string.IsNullOrEmpty(builder.Name)) { var package = builder.Build(); InsertCatalogEntry(db, package); } } builder.Reset(); #if DEV14_OR_LATER try { #endif token = JToken.ReadFrom(jsonReader); #if DEV14_OR_LATER } catch (JsonReaderException) { // Reached end of file, so continue. break; } #endif module = token.FirstOrDefault(); } } } // FTS doesn't support INSERT OR REPLACE. This is the most efficient way to bypass that limitation. db.Execute("DELETE FROM CatalogEntry WHERE docid NOT IN (SELECT MAX(docid) FROM CatalogEntry GROUP BY Name)"); }); } }