Skip to content

Commit

Permalink
Reduce some allocations
Browse files Browse the repository at this point in the history
  • Loading branch information
cvium committed May 16, 2021
1 parent 5acb4e9 commit 1b49435
Show file tree
Hide file tree
Showing 17 changed files with 724 additions and 541 deletions.
6 changes: 3 additions & 3 deletions Emby.Naming/Audio/AudioFileParser.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System;
using System.IO;
using System.Linq;
using Emby.Naming.Common;
using MediaBrowser.Common.Extensions;

namespace Emby.Naming.Audio
{
Expand All @@ -18,8 +18,8 @@ public static class AudioFileParser
/// <returns>True if file at path is audio file.</returns>
public static bool IsAudioFile(string path, NamingOptions options)
{
var extension = Path.GetExtension(path);
return options.AudioFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase);
var extension = Path.GetExtension(path.AsSpan());
return options.AudioFileExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase);
}
}
}
1 change: 1 addition & 0 deletions Emby.Naming/Emby.Naming.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj" />
<ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj" />
</ItemGroup>

Expand Down
95 changes: 49 additions & 46 deletions Emby.Naming/Video/ExtraResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,70 +29,73 @@ public ExtraResolver(NamingOptions options)
/// <param name="path">Path to file.</param>
/// <returns>Returns <see cref="ExtraResult"/> object.</returns>
public ExtraResult GetExtraInfo(string path)
{
return _options.VideoExtraRules
.Select(i => GetExtraInfo(path, i))
.FirstOrDefault(i => i.ExtraType != null) ?? new ExtraResult();
}

private ExtraResult GetExtraInfo(string path, ExtraRule rule)
{
var result = new ExtraResult();

if (rule.MediaType == MediaType.Audio)
for (var i = 0; i < _options.VideoExtraRules.Length; i++)
{
if (!AudioFileParser.IsAudioFile(path, _options))
var rule = _options.VideoExtraRules[i];
if (rule.MediaType == MediaType.Audio)
{
return result;
if (!AudioFileParser.IsAudioFile(path, _options))
{
continue;
}
}
}
else if (rule.MediaType == MediaType.Video)
{
if (!new VideoResolver(_options).IsVideoFile(path))
else if (rule.MediaType == MediaType.Video)
{
return result;
if (!new VideoResolver(_options).IsVideoFile(path))
{
continue;
}
}
}

if (rule.RuleType == ExtraRuleType.Filename)
{
var filename = Path.GetFileNameWithoutExtension(path);

if (string.Equals(filename, rule.Token, StringComparison.OrdinalIgnoreCase))
var pathSpan = path.AsSpan();
if (rule.RuleType == ExtraRuleType.Filename)
{
result.ExtraType = rule.ExtraType;
result.Rule = rule;
}
}
else if (rule.RuleType == ExtraRuleType.Suffix)
{
var filename = Path.GetFileNameWithoutExtension(path);
var filename = Path.GetFileNameWithoutExtension(pathSpan);

if (filename.IndexOf(rule.Token, StringComparison.OrdinalIgnoreCase) > 0)
if (filename.Equals(rule.Token, StringComparison.OrdinalIgnoreCase))
{
result.ExtraType = rule.ExtraType;
result.Rule = rule;
}
}
else if (rule.RuleType == ExtraRuleType.Suffix)
{
result.ExtraType = rule.ExtraType;
result.Rule = rule;
var filename = Path.GetFileNameWithoutExtension(pathSpan);

if (filename.Contains(rule.Token, StringComparison.OrdinalIgnoreCase))
{
result.ExtraType = rule.ExtraType;
result.Rule = rule;
}
}
}
else if (rule.RuleType == ExtraRuleType.Regex)
{
var filename = Path.GetFileName(path);
else if (rule.RuleType == ExtraRuleType.Regex)
{
var filename = Path.GetFileName(path);

var regex = new Regex(rule.Token, RegexOptions.IgnoreCase);
var regex = new Regex(rule.Token, RegexOptions.IgnoreCase);

if (regex.IsMatch(filename))
if (regex.IsMatch(filename))
{
result.ExtraType = rule.ExtraType;
result.Rule = rule;
}
}
else if (rule.RuleType == ExtraRuleType.DirectoryName)
{
result.ExtraType = rule.ExtraType;
result.Rule = rule;
var directoryName = Path.GetFileName(Path.GetDirectoryName(pathSpan));
if (directoryName.Equals(rule.Token, StringComparison.OrdinalIgnoreCase))
{
result.ExtraType = rule.ExtraType;
result.Rule = rule;
}
}
}
else if (rule.RuleType == ExtraRuleType.DirectoryName)
{
var directoryName = Path.GetFileName(Path.GetDirectoryName(path));
if (string.Equals(directoryName, rule.Token, StringComparison.OrdinalIgnoreCase))

if (result.ExtraType != null)
{
result.ExtraType = rule.ExtraType;
result.Rule = rule;
return result;
}
}

Expand Down
22 changes: 10 additions & 12 deletions Emby.Naming/Video/VideoResolver.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
using System;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using Emby.Naming.Common;
using MediaBrowser.Common.Extensions;

namespace Emby.Naming.Video
{
Expand Down Expand Up @@ -59,15 +59,15 @@ public VideoResolver(NamingOptions options)
}

bool isStub = false;
string? container = null;
ReadOnlySpan<char> container = null;
string? stubType = null;

if (!isDirectory)
{
var extension = Path.GetExtension(path);
var extension = Path.GetExtension(path.AsSpan());

// Check supported extensions
if (!_options.VideoFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase))
if (!_options.VideoFileExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase))
{
// It's not supported. Check stub extensions
if (!StubResolver.TryResolveFile(path, _options, out stubType))
Expand All @@ -86,9 +86,7 @@ public VideoResolver(NamingOptions options)

var extraResult = new ExtraResolver(_options).GetExtraInfo(path);

var name = isDirectory
? Path.GetFileName(path)
: Path.GetFileNameWithoutExtension(path);
var name = Path.GetFileNameWithoutExtension(path);

int? year = null;

Expand All @@ -107,7 +105,7 @@ public VideoResolver(NamingOptions options)

return new VideoFileInfo(
path: path,
container: container,
container: container.ToString(),
isStub: isStub,
name: name,
year: year,
Expand All @@ -126,8 +124,8 @@ public VideoResolver(NamingOptions options)
/// <returns>True if is video file.</returns>
public bool IsVideoFile(string path)
{
var extension = Path.GetExtension(path);
return _options.VideoFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase);
var extension = Path.GetExtension(path.AsSpan());
return _options.VideoFileExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase);
}

/// <summary>
Expand All @@ -137,8 +135,8 @@ public bool IsVideoFile(string path)
/// <returns>True if is video file stub.</returns>
public bool IsStubFile(string path)
{
var extension = Path.GetExtension(path);
return _options.StubFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase);
var extension = Path.GetExtension(path.AsSpan());
return _options.StubFileExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase);
}

/// <summary>
Expand Down
6 changes: 2 additions & 4 deletions Emby.Server.Implementations/Data/BaseSqliteRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -181,11 +181,9 @@ protected List<string> GetColumnNames(IDatabaseConnection connection, string tab

foreach (var row in connection.Query("PRAGMA table_info(" + table + ")"))
{
if (row[1].SQLiteType != SQLiteType.Null)
if (row.TryGetString(1, out var columnName))
{
var name = row[1].ToString();

columnNames.Add(name);
columnNames.Add(columnName);
}
}

Expand Down
110 changes: 100 additions & 10 deletions Emby.Server.Implementations/Data/SqliteExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using SQLitePCL.pretty;

Expand Down Expand Up @@ -96,46 +97,135 @@ public static DateTime ReadDateTime(this IResultSetValue result)
DateTimeStyles.None).ToUniversalTime();
}

public static DateTime? TryReadDateTime(this IResultSetValue result)
public static bool TryReadDateTime(this IReadOnlyList<IResultSetValue> reader, int index, [NotNullWhen(true)] out DateTime? result)
{
var dateText = result.ToString();
result = null;
var item = reader[index];
if (item.IsDbNull())
{
return false;
}

var dateText = item.ToString();

if (DateTime.TryParseExact(dateText, _datetimeFormats, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out var dateTimeResult))
{
return dateTimeResult.ToUniversalTime();
result = dateTimeResult.ToUniversalTime();
return true;
}

return false;
}

public static bool TryGetGuid(this IReadOnlyList<IResultSetValue> reader, int index, [NotNullWhen(true)] out Guid? result)
{
result = null;
var item = reader[index];
if (item.IsDbNull())
{
return false;
}

return null;
result = item.ReadGuidFromBlob();
return true;
}

public static bool IsDBNull(this IReadOnlyList<IResultSetValue> result, int index)
private static bool IsDbNull(this IResultSetValue result)
{
return result[index].SQLiteType == SQLiteType.Null;
return result.SQLiteType == SQLiteType.Null;
}

public static string GetString(this IReadOnlyList<IResultSetValue> result, int index)
{
return result[index].ToString();
}

public static bool TryGetString(this IReadOnlyList<IResultSetValue> reader, int index, out string result)
{
result = null;
var item = reader[index];
if (item.IsDbNull())
{
return false;
}

result = item.ToString();
return true;
}

public static bool GetBoolean(this IReadOnlyList<IResultSetValue> result, int index)
{
return result[index].ToBool();
}

public static int GetInt32(this IReadOnlyList<IResultSetValue> result, int index)
public static bool TryGetBoolean(this IReadOnlyList<IResultSetValue> reader, int index, [NotNullWhen(true)] out bool? result)
{
result = null;
var item = reader[index];
if (item.IsDbNull())
{
return false;
}

result = item.ToBool();
return true;
}

public static bool TryGetInt(this IReadOnlyList<IResultSetValue> reader, int index, out int? result)
{
return result[index].ToInt();
result = null;
var item = reader[index];
if (item.IsDbNull())
{
return false;
}

result = item.ToInt();
return true;
}

public static long GetInt64(this IReadOnlyList<IResultSetValue> result, int index)
{
return result[index].ToInt64();
}

public static float GetFloat(this IReadOnlyList<IResultSetValue> result, int index)
public static bool TryGetLong(this IReadOnlyList<IResultSetValue> reader, int index, out long? result)
{
result = null;
var item = reader[index];
if (item.IsDbNull())
{
return false;
}

result = item.ToInt64();
return true;
}

public static bool TryGetFloat(this IReadOnlyList<IResultSetValue> reader, int index, out float? result)
{
result = null;
var item = reader[index];
if (item.IsDbNull())
{
return false;
}

result = item.ToFloat();
return true;
}

public static bool TryGetDouble(this IReadOnlyList<IResultSetValue> reader, int index, out double? result)
{
return result[index].ToFloat();
result = null;
var item = reader[index];
if (item.IsDbNull())
{
return false;
}

result = item.ToDouble();
return true;
}

public static Guid GetGuid(this IReadOnlyList<IResultSetValue> result, int index)
Expand Down
Loading

0 comments on commit 1b49435

Please sign in to comment.