Fixed: Rename movie not working (#1970) (Fixes #1908)

pull/2/head
Leonardo Galli 7 years ago committed by GitHub
parent 4d5a5ed2c1
commit 685c5daf36

@ -14,8 +14,10 @@ You should have received a copy of the GNU Lesser General Public
License along with this library. If not, see <http://www.gnu.org/licenses/>. */ License along with this library. If not, see <http://www.gnu.org/licenses/>. */
using System; using System;
using System.Collections.Generic;
using System.Data; using System.Data;
using System.Data.Common; using System.Data.Common;
using System.Runtime.InteropServices.ComTypes;
using Marr.Data.Converters; using Marr.Data.Converters;
namespace Marr.Data.Parameters namespace Marr.Data.Parameters
@ -42,16 +44,26 @@ namespace Marr.Data.Parameters
Type valueType = value.GetType(); Type valueType = value.GetType();
// Check for a registered IConverter // Check for a registered IConverter
IConverter converter = MapRepository.Instance.GetConverter(valueType); //If we have a list of ints, we ignore the converter since we want to do an in statement!
if (converter != null) var list = value as List<int>;
if (list != null)
{ {
Parameter.Value = converter.ToDB(value); Parameter.Value = $"{string.Join(",", list)}";
} }
else else
{ {
Parameter.Value = value; IConverter converter = MapRepository.Instance.GetConverter(valueType);
if (converter != null)
{
Parameter.Value = converter.ToDB(value);
}
else
{
Parameter.Value = value;
}
} }
//// Determine the correct DbType based on the passed in value type //// Determine the correct DbType based on the passed in value type
//IDbTypeBuilder typeBuilder = MapRepository.Instance.DbTypeBuilder; //IDbTypeBuilder typeBuilder = MapRepository.Instance.DbTypeBuilder;
//Enum dbType = typeBuilder.GetDbType(valueType); //Enum dbType = typeBuilder.GetDbType(valueType);

@ -68,5 +68,13 @@ namespace Marr.Data.QGen.Dialects
{ {
get { return "({0} LIKE '%' + {1} + '%')"; } get { return "({0} LIKE '%' + {1} + '%')"; }
} }
public virtual string InFormat
{
get
{
return "({0} in ({1}))";
}
}
} }
} }

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.Text; using System.Text;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Data.Common; using System.Data.Common;
@ -93,6 +94,10 @@ namespace Marr.Data.QGen
Write_EndsWith(expression); Write_EndsWith(expression);
break; break;
case "In":
Write_In(expression);
break;
default: default:
string msg = string.Format("'{0}' expressions are not yet implemented in the where clause expression tree parser.", method); string msg = string.Format("'{0}' expressions are not yet implemented in the where clause expression tree parser.", method);
throw new NotImplementedException(msg); throw new NotImplementedException(msg);
@ -140,31 +145,47 @@ namespace Marr.Data.QGen
return expression; return expression;
} }
private object GetRightValue(Expression rightExpression) private object GetRightValue(Expression expression)
{ {
object rightValue = null; object rightValue = null;
var right = rightExpression as ConstantExpression; var simpleConstExp = expression as ConstantExpression;
if (right == null) // Value is not directly passed in as a constant if (simpleConstExp == null) // Value is not directly passed in as a constant
{ {
var rightMemberExp = (rightExpression as MemberExpression); MemberExpression memberExp = expression as MemberExpression;
var parentMemberExpression = rightMemberExp.Expression as MemberExpression; ConstantExpression constExp = null;
if (parentMemberExpression != null) // Value is passed in as a property on a parent entity
// Value may be nested in multiple levels of objects/properties, so traverse the MemberExpressions
// until a ConstantExpression property value is found, and then unwind the stack to get the value.
var memberNames = new Stack<string>();
while (memberExp != null)
{ {
string entityName = (rightMemberExp.Expression as MemberExpression).Member.Name; memberNames.Push(memberExp.Member.Name);
var container = ((rightMemberExp.Expression as MemberExpression).Expression as ConstantExpression).Value;
var entity = _repos.ReflectionStrategy.GetFieldValue(container, entityName); // Function calls are not supported - user needs to simplify their Where expression.
rightValue = _repos.ReflectionStrategy.GetFieldValue(entity, rightMemberExp.Member.Name); var methodExp = memberExp.Expression as MethodCallExpression;
if (methodExp != null)
{
var errMsg = string.Format("Function calls are not supported by the Where clause expression parser. Please evaluate your function call, '{0}', manually and then use the resulting paremeter value in your Where expression.", methodExp.Method.Name);
throw new NotSupportedException(errMsg);
}
constExp = memberExp.Expression as ConstantExpression;
memberExp = memberExp.Expression as MemberExpression;
} }
else // Value is passed in as a variable
object entity = constExp.Value;
while (memberNames.Count > 0)
{ {
var parent = (rightMemberExp.Expression as ConstantExpression).Value; string entityName = memberNames.Pop();
rightValue = _repos.ReflectionStrategy.GetFieldValue(parent, rightMemberExp.Member.Name); entity = _repos.ReflectionStrategy.GetFieldValue(entity, entityName);
} }
rightValue = entity;
} }
else // Value is passed in directly as a constant else // Value is passed in directly as a constant
{ {
rightValue = right.Value; rightValue = simpleConstExp.Value;
} }
return rightValue; return rightValue;
@ -238,6 +259,17 @@ namespace Marr.Data.QGen
_sb.AppendFormat(_dialect.ContainsFormat, fqColumn, paramName); _sb.AppendFormat(_dialect.ContainsFormat, fqColumn, paramName);
} }
private void Write_In(MethodCallExpression body)
{
object value = GetRightValue(body.Arguments[1]);
//string paramName = string.Concat(_paramPrefix, "P", _command.Parameters.Count.ToString());
//var parameter = new ParameterChainMethods(_command, paramName, value).Parameter;
MemberExpression memberExp = (body.Arguments[0] as MemberExpression);
string fqColumn = GetFullyQualifiedColumnName(memberExp.Member, memberExp.Expression.Type);
_sb.AppendFormat(_dialect.InFormat, fqColumn, string.Join(",", value as List<int>));
}
private void Write_StartsWith(MethodCallExpression body) private void Write_StartsWith(MethodCallExpression body)
{ {
// Add parameter to Command.Parameters // Add parameter to Command.Parameters

@ -105,5 +105,9 @@ namespace NzbDrone.Common.Extensions
yield return buffer.Dequeue(); yield return buffer.Dequeue();
} }
} }
public static bool In<T>(this T source, List<T> list)
{
return list.Contains(source);
}
} }
} }

@ -83,11 +83,12 @@ namespace NzbDrone.Core.Datastore
{ {
var idList = ids.ToList(); var idList = ids.ToList();
var query = string.Format("Id IN ({0})", string.Join(",", idList)); var query = string.Format("Id IN ({0})", string.Join(",", idList));
var result = Query.Where(query).ToList(); var result = Query.Where(m => m.Id.In(idList)).ToList();
//var result = Query.Where(query).ToList();
if (result.Count != idList.Count()) if (result.Count != idList.Count())
{ {
throw new ApplicationException("Expected query to return {0} rows but returned {1}".Inject(idList.Count(), result.Count)); throw new ApplicationException("Expected query to return {0} rows but returned {1}.".Inject(idList.Count(), result.Count));
} }
return result; return result;

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.SQLite;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.IO; using System.IO;
@ -198,14 +199,22 @@ namespace NzbDrone.Core.MediaFiles
public void Execute(RenameMovieFolderCommand message) public void Execute(RenameMovieFolderCommand message)
{ {
_logger.Debug("Renaming movie folder for selected movie if necessary"); try
var moviesToRename = _movieService.GetMovies(message.MovieIds); {
foreach(var movie in moviesToRename) _logger.Debug("Renaming movie folder for selected movie if necessary");
{ var moviesToRename = _movieService.GetMovies(message.MovieIds);
var movieFiles = _mediaFileService.GetFilesByMovie(movie.Id); foreach(var movie in moviesToRename)
_logger.ProgressInfo("Renaming movie folder for {0}", movie.Title); {
RenameMoviePath(movie); var movieFiles = _mediaFileService.GetFilesByMovie(movie.Id);
} _logger.ProgressInfo("Renaming movie folder for {0}", movie.Title);
RenameMoviePath(movie);
}
}
catch (SQLiteException ex)
{
_logger.Warn(ex, "wtf: {0}, {1}", ex.ResultCode, ex.Data);
}
} }
} }
} }

Loading…
Cancel
Save