From 5b2111ff115d0e1b23f3054af525b88b238cff39 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Wed, 22 Jun 2011 23:52:37 -0700 Subject: [PATCH 1/3] Updated Migrator.net with SQL CE support --- Libraries/Migrator.NET/Migrator.Framework.pdb | Bin 73216 -> 0 bytes Libraries/Migrator.NET/Migrator.Providers.dll | Bin 77312 -> 78336 bytes Libraries/Migrator.NET/Migrator.Providers.pdb | Bin 165376 -> 0 bytes Libraries/Migrator.NET/Migrator.Providers.xml | 58 ++++---- Libraries/Migrator.NET/Migrator.XML | 124 ++++++++++++++++++ Libraries/Migrator.NET/Migrator.dll | Bin 16384 -> 16384 bytes Libraries/Migrator.NET/Migrator.pdb | Bin 52736 -> 0 bytes 7 files changed, 153 insertions(+), 29 deletions(-) delete mode 100644 Libraries/Migrator.NET/Migrator.Framework.pdb delete mode 100644 Libraries/Migrator.NET/Migrator.Providers.pdb create mode 100644 Libraries/Migrator.NET/Migrator.XML delete mode 100644 Libraries/Migrator.NET/Migrator.pdb diff --git a/Libraries/Migrator.NET/Migrator.Framework.pdb b/Libraries/Migrator.NET/Migrator.Framework.pdb deleted file mode 100644 index 01826492f43412c59f59cab104fc53ab405e98b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73216 zcmeI54}g_bng8EA+!+DE08vpf2OI?vVFm^m40DDVhCx9Q#=shLhM5bD3^U`*9fj7m zYobzV(JpS7?k<&dcn7j`Qh*li-T>Ke5UAAkIuR1_7{Kt zgW(%4u-C`_?M?3u&n=%BGZ~w2K zpSb46B|E>q?pXQ{xBSEFhi7gac~AtG?BT;RH;z23`>Xu#zhTbXlRtRzmu0s-z46>NKu#*t@rf0h5dM^9hZ ze*I}zjsE`G-@5lJo1Q!Ja`Ny^vG#WA)gJ8y*1kVIyek36fPr8T(1cElxVWP+y(9ip9P--_kerB=fM}iec+4WAHY9?E#OPwe(+_m6?_H!6ZmKF z0Qf5S7x1s(LGTdx8h99N1CM~OgKvOG!8gITz`udVz_-D_gYSUH!FR#;!1uv+@C5h) z_#t=_{0RIQ{2%ZXcpCf%_z8FhJPZC4{9mvGJO_RXeg>WgFMyweUx1z9Mes}TEASHd zHTVs98SDbDfZu}u0dtFgu(q_Wr>lEe*P5oe?dhfk?JIg( z(p^21E}qla)Z5bXzAk?Hz5Yo~HVazEo$rwyUFWb?2nk zUPiX_npUqZZF7;XAkx)7(#}-cL>hW54XvkSSLec>u4~${{IYa=M|*m$Y%b7b7kxS_`fe9}Ule^|*4v`M;KD7m`Rt-N zNGs;7X-#!2|N6n4R6MT2?5b-?w=7DvcJ;K)S(8q6_F`CX;g+=#TaSq?l@(iIwk>uQ zV_xU-j#R5!(?Qp<_IOkUT9xi;?_8l;e-IhfYa&tIHjxx&$^5PrD^fkZO^dJYSlrsv z-kq**??_qC!gH#_McR9HN3V%=IgwgVMOv7p*&`oZa?n+S*KR z_kY7{X=^(~br+lMyy%b^ZD&XQ(O3BXxRx=rt0T3fr#+oIh%w9e#H}{EYs2UYs|V54 zvaO(*-?kKHkCKZaGkfiVw$e)3pW zHo({MUzro;IWOZ!a|tUrVDunXt-wu1tfYV+@cUha>&|4%U@u{55`CZN=O6;F;G-1;%+Icb&rcz!GX>o=Cawv^wh z2`Y7kr5vA#a@+Hcy?5s}@hbPltFSn)YL(}Gx@6}#@v63oS7C8pm89ogvgL&y@v4Ny ztFSn)YN6-dcGEvyC|=c0@hU9NtJ>swH>Ep2Bwp1r@hU9NtJ>^&&zYO~sCZS&#jCJ5 zuWF#@eXwlK3*uGH6tBYKysGJ*_j^zOc&d2S0>rDZIImig=RM{5?azo87Q?HsIImip z=Y3?&eRIUC)~I+D7Uxy#@Vs~KzWMXwRcjKj!s5JYm7cfyvISoiuUe^i6&B}JZ{m3; zp7cLwi&wpjcoi1sRj=WBSAAgovEo&4B3^~XdDRIuZFusE-JAQ^DlE>6*CBTl0nbAw z43{FUY0I5tiTOL0M?v@SOZ6qF?MbzyQ_&RsVs3x%J~0?DT=A?2lJ)$@1!co8W6-E% zod<880hJm(#AT@bmanpr6!FAqc92Yd`+{G7>&ut_c;16&4l4TBFKlfV&jOyzOo1k8 zFVZtozk!_WN)}a_=TbykqIk}8>B$(Q?Xw-j%%3yh(fYp$s%g8buQx3N8oL&^zt5*d zYx(nGsD*mov3YE7G2*ELB`m- zD7CulnpADq>eXGHOIYe)bxnD{j=+V;O3w4X9eX8%x6A8fP`kKndRaLRe}zk3PWTLk zD;~wWjR@w$Fj;*3R(!q;BRSd`rVwP(zyEn)pCyjX$%9vkST0@%&xB{H(;ra#Shq8C zf1mIBm*=*Qczu&x9oa~`mz!XT`OCAAk_)}QNv&G3G5N6@+nV7QuMbx~N(k?GK9~D^ z-v9i_wolJ>R8F=nCBpnr_E0B`8_Humpy#leBu^xhJh_qFI$-N$<>Mw>YfdJ6Oe=-Z*d&~eaGu4M~(m#KkL9+@OhZ6GM68T#QvE=E<(oH7fA>l~=azM0rTjn&;9GJuA*6c?v6AX8~KTiLgGXdMNF3 z*qu?|LtbWNi)doNPSlxM*t(-cfwklZamygq!e`uoLed()}a)SdA6B<|R>?rD}}=cYPS zJ?*W?Md4bzB^uLz6fy>=jP^DL)EUF=UIyuq+d-QC;M24smA*2%AE!rEe(X;lZriK! z$F^}hhTh}!sSbPhoOtjsL6T(M{1?ur>TByo`tFpxW zeStKs_IhGVqY6BjG-+-rH`)^O_vh%k+v`#}nUSn8Jw8okYK*v2^Vk0Q1$rLwdKRUY zr&v#JO|><45nM=`ysiyS*VLG;DHF9Q&s$yI=8h*&!Mvaq%|)D|Dsfy6RHPTlzZE?`q+3DZGW~^J!b-^u^Qm68dh7 z>(c@u3(@VJ>4J3q78^A#+VLY{#u6?ymkP&R%}HbmZ78DxJPkU49c4-G2nO(1ag+hu zpC`%1aw}GvT%$ zOoaWT@?JXSE=E>yUjkL!3!$1PUJ5-Ex){oQO82svNXJP*l9^?a9PxT&tL+05Vc!_f z%PRw`rx_|e%b?T)?UBnw@kVy54n0CeP4KUj-*WLf)Q+6W^eU+AU1j1?o-P7WzCP#T zn5qbH@qFz=MrpqWDw~+sW+p&s*BR!b+GCeVQhSO`I+?|gG9S0*z_ve1n7)Zi%_YM* z@Qujo`X;F2z8P8yT@O{6eHcnT(muQl^+EgaGUUDX;$@=zn27H41GNjQ`vPcG*KD7Z zzs~=4VDslTXp)_jUakQhwtvZA=RXO*^7#&^?EYJ*>ipkB?R~%%L6W-yAD`;H?LYF{ zaTjtbr_Vx@thGw+Rj!pcT6>Y}1|t)+Pf!h-!5XjuXzsNQJOy3_LulA#U=~;ky1{y| z89WHI{c3N(Taa0|E#JPQ7to!XtB|I@yVJJnH<#q{|zDFCt)MmzsMka30n zCTo8DnBu{mVTt)m|5DQEb<}ischIN`(c$}PYj48rHa$d57eUpx zkj{+ielb06F{43}zlu+C*0w}wv#NyZvfL8n=r*+1H!}>{1TE(7r^NL6=Z5uH>&|lG zd4}J+z(5QeE#v-#PU?O6Z+CWR4Zypll+A8mHaYiy>tPbF4?mFmKeIMy?-eJ_qfm4Y z)nE61e*RcxDy`jj?$bj#l?)x^>T_LtZ+BO3N?`|5-;^iud%ioJ9@PWy-VM)quZIV4 z@;?|IWRP)j9q&QMbgyGcOHb!P>S)WOgZf-j=XJ2Pp_SY!BprSpt3FrmWJ}E7E6}mX z>oDz~y%cq`Yge{(u2A6=qR-cXS+3p1^X<6u4`2t4k}G+oG#5ny=y_&ZC=;nRqfr~lof%6 z=i`dxiX)1UjW#q?H+s7wNe=mJ1GC!s=XES3eX${w- zM-t9h$NaD!Ud{i<1pa=lfiT+#=O3fBF3pgmHCi)9lQuI(GcU;`8C#3Z8uKY(eC6=k zzBd27atv~+!()y78Ci0+|I9CUmXjN2%S+vc z?3aU@`7ieq8Pe|V9W@V*@=m)A@H?jMuf#rZs!ob8M9%e}+NVIy)=v*c{w zl3%Xc$<-LSX<2f%pGXA0|4`Ro2IS_zuepA`k;^U<+wSwrUFhU4GIEo$^w~C?|9)EY zKDEV#Ms7xyoNbf&)5qM@xqi>i9>Od1n zgImB|;6WfqboAZX&wr0GA@75DlP2A7%iU{<`Fk;XPNGtoykmWLUQds$EQIQrbQ;@|$VtZY`Dd`0 zH{3>Lo^^-MVEwc3eBoNVv2*$Tf9B)!%a@Ix`;D;5&0qSPl5MecT-Mpz)z@h@mL62u z3{iu{>E6{l`m~ZC#B|vzcVP3E+%);QUtACO%q1_x^!O?#I|``>z74ITuac{=#Qf#H zykvK%OKSp)`Z`j*rVd<39xOyg{GP|J^CRNw0Pn`8dRYy(^=1n)>Mt3agCXvI_C&Ww zA}-TTxayhaqz&+E96rhMONW|9oWBRF@G^Bs^=SX=l5NXA-!;$D7;XE~XdPSn%77eg zKb&U`kd^e_lG_fG?bBGNb8YH8{2!Gt4)e{k^+8b0%UDV?>!8%v%(+}s#u<%ggk|Wv zG{?&@ZlNK_C_i`(pIHOdeC%eZ=3{>YJq3CiLP=-l9ndqOdJcaU^m6DpsP?vvhh7Uk8+sFT0`xX0WtzDQ zIuZJ1C~3-k9Xbj61avZV2bBEH=w&zBeC7@46zEX$Xex9xv=Vv_bQ)Cq4mFpW2i06k z>xWg)70{W`YoO$D=0>RIP8*?`JADRvKJ=1wUV1ik3^)gj1*ZY62bTi* zX)amesQkpExp|pG6I5|1K7|Q-2BK#LX+0hu1G&#VdL36;YfDi_4wL zwbses4rHsn_Vrrz-j1V*aNMKVOq+!0J^75{R~rzo9SigGUTt{Cg}inwON3)wJl?-B zyba;{pB-ls;W$N6gmd-`yp3F654{KaK_lA|Bze2vr$g=9js?*(E{faO3^D8e>a=KE z8KoyKXZ!U;*x$$HJ_0{&So<)LJ2y+t_S5<0HaNMD8@b7$+&bd2{b|DVtz2g98@dgC z>Hh?jzC!Q!XK3qYAB^S-cW_M`G|vHOGbWt2VJK}t@AzkIeVt4nG!`E^dFq6A&7A|z zFm-4|I5+ldrVHVFlEHf?Q0F@el!FG)46Xwk!4~iscpkhCv{$qe%m-~iHfR&dnW z97sa^e0j6Wlz8@Rqllhl;8FVs%$p!~e3aZ$AYLCHU;ouOIQy;k(NLKbkLr@Bob=?* z=lwikpfSSgG|c>Y1pA)JvTuHSCnNHK%ty8nhwN29qPA+&lQ3!Hk}*AMs~QujT4qel zy)UUW{kLXiV+r@>hFPe%Sc)=P%=%$zSr+$Oj{E1pZO^`}^3ZT>2^Q&~YYA$^E{n&T8ygyRfCFH}%eCS6*3e+N0z*0?By3 z_&AVnpQmrH$nLehvO8nH-UU#d*L+O9^xnpeYS+$GZ@imJy?)TA%O{J#0~t4zH|i(+ z_@p_#+)k%Yzp39P+whPac=M4>|6Yf@__e?#orL;&LelC&>u=S4RJEs>T{$M(S(IfUTnmQ(w6>X{66K zjyjwfPicByTR#$Jej*0tN1Qjw9iw=4Z)(dg5tcpUe9$BT9M76E>We5)^E^ZM+uR$Q z`|dNL>eDWOY7AKj)qV9q1%;%uxseYb990kh3QTNt4pmyfx|1>e<^qj=IRrFs&$xDhG zM!Wx~zvq9?IAxkYdDns7Q@vg{|J%QIZ|88bTYZJvC-ph7X^5Wjs9!2~$`}_i>QgnR zkPT{w1I#+fsiw{;4)I!h@;{f-{9gUdXlU;IUhhQ8X{>4>O-&#TZUKL47cc)ioiX%J zp`*_-v#EIbYpjr5Gw{3$&o|bq3~2rP9?KC{d>WrcNu_0^6kD z1nE5v9y)RARJh~%KNK^u*J{*i-UeuSfN-fOl?k)ALfE^l&d(a+TMk@;L}Sey+dNHMDqon0J(1 z>-8u-^LppCahMyYqV4CL%l5rKO}_0umPZ%;WyuZMx)%1duWspC%h5jg7gEQ)zAD$> z#?wZ>T=KEFzJqvIA~${aIDPRt$Xu=D4zEvT)(`spSVpwe?PzURRmP8H8pG6KQ#Z}p zuw94H+I(3!mX#51`_24o<(g*>W;W@^J=^EyANQEYnsHBbFwY3iW)3Gg>6i#)r!NP! zN9;2048wm~sKfR@`E?MN(IGmRJCf6b(ol!(Px9+HJ4c7@6Y}er;B<)Q>acA*zYfi< z2QxGGd1c#aejSvNNrz~z4%_bX>zHQv&j{0O+f9C6&EW^fo{88xpP!d|j*wUN$JW>U zwpYWeauglRYScK&`c6uj zJ?8Jl@dIdDIo214%^v{C}H^hCU;7zosAi%-dWU=j{Jk z1DAMxczoUGt=|9DT&s}#2u&+;*Ll4CWv(J>9_ih0u>Zjv`wwJnQTk=8*P;7kxp)

XO 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 o&=x%bI}+P?kk_c6-c@0s=k#&-%_=(U>S} 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 V1r|$TGkxB0vmIY)|Nnsk{|hO^qT>Jn literal 77312 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⁢^rKM8-voVu>qnpmpkIdm0s2_* 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.Providers - +

- Summary description for SQLiteTransformationProvider. + Migration transformations provider for Microsoft SQL Server Compact Edition. + + + + + Migration transformations provider for Microsoft SQL Server. @@ -185,23 +190,6 @@ The list of Migrations currently applied to the database. - - - Turn something like 'columnName INTEGER NOT NULL' into just 'columnName' - - - - - Name is the first value before the space. - - - - - - - No Op (Null Object Pattern) implementation of the ITransformationProvider - - Defines the implementations specific details for a particular database. @@ -263,16 +251,6 @@ The DbType True if the database type has an unsigned variant, otherwise false - - - Migration transformations provider for Microsoft SQL Server. - - - - - Migration transformations provider for Microsoft SQL Server. - - Migration transformations provider for PostgreSql (using NPGSql .Net driver) @@ -385,5 +363,27 @@ Summary description for MySqlTransformationProvider. + + + Summary description for SQLiteTransformationProvider. + + + + + Turn something like 'columnName INTEGER NOT NULL' into just 'columnName' + + + + + Name is the first value before the space. + + + + + + + No Op (Null Object Pattern) implementation of the ITransformationProvider + + diff --git a/Libraries/Migrator.NET/Migrator.XML b/Libraries/Migrator.NET/Migrator.XML new file mode 100644 index 000000000..665acafbd --- /dev/null +++ b/Libraries/Migrator.NET/Migrator.XML @@ -0,0 +1,124 @@ + + + + Migrator + + + + + Comparer of Migration by their version attribute. + + + + + Finds the next migration available to be applied. Only returns + migrations that have NOT already been applied. + + The migration number of the next available Migration. + + + + Finds the previous migration that has been applied. Only returns + migrations that HAVE already been applied. + + The most recently applied Migration. + + + + Migrations mediator. + + + + + Run all migrations up to the latest. Make no changes to database if + dryrun is true. + + + + + Migrate the database to a specific version. + Runs all migration between the actual version and the + specified version. + If version is greater then the current version, + the Up() method will be invoked. + If version lower then the current version, + the Down() method of previous migration will be invoked. + If dryrun is set, don't write any changes to the database. + + The version that must became the current one + + + + Returns registered migration types. + + + + + Returns the current migrations applied to the database. + + + + + Get or set the event logger. + + + + + Handles inspecting code to find all of the Migrations in assemblies and reading + other metadata such as the last revision, etc. + + + + + Check for duplicated version in migrations. + + CheckForDuplicatedVersion + + + + Collect migrations in one Assembly. + + The Assembly to browse. + The migrations collection + + + + Returns the version of the migration + MigrationAttribute. + + Migration type. + Version number sepcified in the attribute + + + + Returns registered migration types. + + + + + Returns the last version of the migrations. + + + + + Exception thrown in a migration Down() method + when changes can't be undone. + + + + + Exception thrown when a migration number is not unique. + + + + + Handles loading Provider implementations + + + + + Description of MigrateAnywhere. + + + + diff --git a/Libraries/Migrator.NET/Migrator.dll b/Libraries/Migrator.NET/Migrator.dll index fbcf23e2a6d04db3e71451fa7a18b57156783e5b..88e7addb7d82b3a36cc17fed3ac34a6d95809a0a 100644 GIT binary patch literal 16384 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 diff --git a/Libraries/Migrator.NET/Migrator.pdb b/Libraries/Migrator.NET/Migrator.pdb deleted file mode 100644 index 832d105b165893162ebdfd5a61acb8de35d0ffdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52736 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 Date: Wed, 22 Jun 2011 23:56:17 -0700 Subject: [PATCH 2/3] Switched to SQLCE 4.0 --- .gitignore | 3 +- NzbDrone.5.1.ReSharper | 71 ++ NzbDrone.Core.Test/EpisodeProviderTest.cs | 50 +- NzbDrone.Core.Test/EpisodeStatusTest.cs | 5 +- NzbDrone.Core.Test/Framework/Fixtures.cs | 2 +- NzbDrone.Core.Test/Framework/MockLib.cs | 2 +- NzbDrone.Core.Test/HistoryProviderTest.cs | 18 +- .../InventoryProvider_QualityNeededTest.cs | 5 +- NzbDrone.Core.Test/JobProviderTest.cs | 36 +- NzbDrone.Core.Test/LogProviderTest.cs | 7 +- NzbDrone.Core.Test/QualityTest.cs | 25 +- NzbDrone.Core.Test/RootDirProviderTest.cs | 16 +- NzbDrone.Core.Test/SabProviderTest.cs | 9 +- NzbDrone.Core.Test/SeriesProviderTest.cs | 2 +- NzbDrone.Core/Datastore/Connection.cs | 12 +- .../Datastore/Migrations/Migration20110619.cs | 24 - ...ration20110616.cs => Migration20110622.cs} | 34 +- NzbDrone.Core/Datastore/MigrationsHelper.cs | 20 +- NzbDrone.Core/Datastore/PetaPoco/PetaPoco.cs | 651 +++++++++--------- .../Instrumentation/SubsonicTarget.cs | 4 + NzbDrone.Core/Model/EpisodeParseResult.cs | 15 +- NzbDrone.Core/NzbDrone.Core.csproj | 4 +- .../Providers/Core/ConfigProvider.cs | 10 +- NzbDrone.Core/Providers/EpisodeProvider.cs | 10 +- NzbDrone.Core/Providers/Jobs/JobProvider.cs | 2 +- NzbDrone.Core/Providers/MediaFileProvider.cs | 2 +- NzbDrone.Core/Providers/SeriesProvider.cs | 17 +- NzbDrone.Core/Repository/Episode.cs | 4 +- NzbDrone.Web/Controllers/MissingController.cs | 2 +- NzbDrone.Web/Controllers/SeriesController.cs | 10 +- .../Controllers/UpcomingController.cs | 8 +- NzbDrone.Web/Global.asax.cs | 3 +- NzbDrone.Web/Views/Series/Index.cshtml | 60 +- 33 files changed, 646 insertions(+), 497 deletions(-) delete mode 100644 NzbDrone.Core/Datastore/Migrations/Migration20110619.cs rename NzbDrone.Core/Datastore/Migrations/{Migration20110616.cs => Migration20110622.cs} (91%) diff --git a/.gitignore b/.gitignore index 5a23bee56..9cec3fceb 100644 --- a/.gitignore +++ b/.gitignore @@ -33,4 +33,5 @@ _ReSharper*/ #NZBDrone specific *.db *Web.Publish.xml -NzbDrone.Web/NzbDrone.Web.Publish.xml \ No newline at end of file +NzbDrone.Web/NzbDrone.Web.Publish.xml +*.sdf \ No newline at end of file diff --git a/NzbDrone.5.1.ReSharper b/NzbDrone.5.1.ReSharper index a23a81a3a..ef107f44c 100644 --- a/NzbDrone.5.1.ReSharper +++ b/NzbDrone.5.1.ReSharper @@ -70,4 +70,75 @@ + + + Replace with FluentAssertion + $arg$.Should().BeTrue(); + + + + + + + + Replace with FluentAssertion + $arg$.Should().BeFalse(); + + + + + + + + $actual$.Should().Be($excpected$); + + + False + False + False + Never + + + + + + + + $excpected$.Should().Be($actual$); + + + + + + + + + $arg$.Should().NotBeNull(); + Assert.IsNotNull($arg$); + + + + + + + $arg$.Should().NotBeEmpty(); + Assert.IsNotEmpty($arg$); + + + + + + + $arg$.Should().BeEmpty(); + Assert.IsEmpty($arg$); + + + + + + \ No newline at end of file diff --git a/NzbDrone.Core.Test/EpisodeProviderTest.cs b/NzbDrone.Core.Test/EpisodeProviderTest.cs index 2dea94e39..6b6da3c27 100644 --- a/NzbDrone.Core.Test/EpisodeProviderTest.cs +++ b/NzbDrone.Core.Test/EpisodeProviderTest.cs @@ -284,6 +284,46 @@ public void RefreshEpisodeInfo_emptyRepo() mocker.VerifyAllMocks(); } + [Test] + public void RefreshEpisodeInfo_should_set_older_than_1900_to_null() + { + //Arrange + const int seriesId = 71663; + + var fakeEpisodes = Builder.CreateNew().With( + c => c.Episodes = + new List(Builder.CreateListOfSize(10). + WhereAll() + .Have(l => l.Language = new TvdbLanguage(0, "eng", "a")) + .WhereTheFirst(7).Have(e => e.FirstAired = new DateTime(1800, 1, 1)) + .AndTheRemaining().Have(e => e.FirstAired = DateTime.Now) + .Build()) + ).With(c => c.Id = seriesId).Build(); + + var fakeSeries = Builder.CreateNew().With(c => c.SeriesId = seriesId).Build(); + + + var mocker = new AutoMoqer(); + + mocker.SetConstant(MockLib.GetEmptyDatabase()); + + mocker.GetMock() + .Setup(c => c.GetSeries(seriesId, true)) + .Returns(fakeEpisodes); + + + //Act + mocker.Resolve().RefreshEpisodeInfo(fakeSeries); + + //Assert + var storedEpisodes = mocker.Resolve().GetEpisodeBySeries(seriesId).ToList(); + storedEpisodes.Should().HaveCount(10); + storedEpisodes.Where(e => e.AirDate == null).Should().HaveCount(7); + storedEpisodes.Where(e => e.AirDate != null).Should().HaveCount(3); + + mocker.VerifyAllMocks(); + } + [Test] public void new_episodes_only_calls_Insert() { @@ -595,7 +635,7 @@ public void GetEpisode_by_Season_Episode_none_existing() var db = MockLib.GetEmptyDatabase(); mocker.SetConstant(db); - + //Act var episode = mocker.Resolve().GetEpisode(1, 1, 1); @@ -660,7 +700,7 @@ public void GetEpisode_by_Season_Episode_without_EpisodeFile() episode.EpisodeFile.Should().BeNull(); } - + [Test] @@ -683,7 +723,7 @@ public void GetEpisode_by_AirDate_with_EpisodeFile() .Returns(fakeSeries); //Act - var episode = mocker.Resolve().GetEpisode(1, fakeEpisodes[0].AirDate); + var episode = mocker.Resolve().GetEpisode(1, fakeEpisodes[0].AirDate.Value); //Assert episode.ShouldHave().AllPropertiesBut(e => e.Series, e => e.EpisodeFile).EqualTo(fakeEpisodes.First()); @@ -709,7 +749,7 @@ public void GetEpisode_by_AirDate_without_EpisodeFile() .Returns(fakeSeries); //Act - var episode = mocker.Resolve().GetEpisode(1, fakeEpisodes[0].AirDate); + var episode = mocker.Resolve().GetEpisode(1, fakeEpisodes[0].AirDate.Value); //Assert episode.ShouldHave().AllPropertiesBut(e => e.Series).EqualTo(fakeEpisodes.First()); @@ -718,6 +758,6 @@ public void GetEpisode_by_AirDate_without_EpisodeFile() } - + } } \ No newline at end of file diff --git a/NzbDrone.Core.Test/EpisodeStatusTest.cs b/NzbDrone.Core.Test/EpisodeStatusTest.cs index ec7996299..c4c551015 100644 --- a/NzbDrone.Core.Test/EpisodeStatusTest.cs +++ b/NzbDrone.Core.Test/EpisodeStatusTest.cs @@ -2,6 +2,7 @@ // ReSharper disable RedundantUsingDirective using System; using FizzWare.NBuilder; +using FluentAssertions; using NUnit.Framework; using NzbDrone.Core.Model; using NzbDrone.Core.Repository; @@ -107,14 +108,14 @@ public void ignored_episode(int offsetDays, bool ignored, bool hasEpisodes, Epis public void low_air_date() { Episode episode = Builder.CreateNew() - .With(e => e.AirDate = DateTime.Now.AddYears(-200)) + .With(e => e.AirDate = DateTime.Now.AddDays(20)) .With(e => e.Ignored = false) .With(e => e.EpisodeFileId = 0) .With(e => e.GrabDate = null) .Build(); - Assert.AreEqual(EpisodeStatusType.NotAired, episode.Status); + episode.Status.Should().Be(EpisodeStatusType.NotAired); } } } \ No newline at end of file diff --git a/NzbDrone.Core.Test/Framework/Fixtures.cs b/NzbDrone.Core.Test/Framework/Fixtures.cs index 877489974..156fa50c2 100644 --- a/NzbDrone.Core.Test/Framework/Fixtures.cs +++ b/NzbDrone.Core.Test/Framework/Fixtures.cs @@ -13,7 +13,7 @@ public class Fixtures [TearDown] public void TearDown() { - var filesToDelete = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.db", SearchOption.AllDirectories); + var filesToDelete = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.sdf", SearchOption.AllDirectories); foreach (var file in filesToDelete) { try diff --git a/NzbDrone.Core.Test/Framework/MockLib.cs b/NzbDrone.Core.Test/Framework/MockLib.cs index 4ebf70d29..a68f47568 100644 --- a/NzbDrone.Core.Test/Framework/MockLib.cs +++ b/NzbDrone.Core.Test/Framework/MockLib.cs @@ -29,7 +29,7 @@ public static IDatabase GetEmptyDatabase(bool enableLogging = false, string file if (String.IsNullOrWhiteSpace(fileName)) { - fileName = Guid.NewGuid() + ".db"; + fileName = Guid.NewGuid() + ".sdf"; } var connectionString = Connection.GetConnectionString(fileName); diff --git a/NzbDrone.Core.Test/HistoryProviderTest.cs b/NzbDrone.Core.Test/HistoryProviderTest.cs index f127b89e3..72e391de3 100644 --- a/NzbDrone.Core.Test/HistoryProviderTest.cs +++ b/NzbDrone.Core.Test/HistoryProviderTest.cs @@ -145,14 +145,13 @@ public void GetBestQualityInHistory_single_result() var result = mocker.Resolve().GetBestQualityInHistory(history.EpisodeId); //Assert - Assert.IsNotNull(result); + result.Should().NotBeNull(); result.QualityType.Should().Be(QualityTypes.Bluray720p); } [Test] public void add_item() { - //Arange var mocker = new AutoMoqer(); var db = MockLib.GetEmptyDatabase(); @@ -181,13 +180,14 @@ public void add_item() var storedHistory = db.Fetch(); storedHistory.Should().HaveCount(1); - Assert.AreEqual(history.Date, storedHistory.First().Date); - Assert.AreEqual(history.EpisodeId, storedHistory.First().EpisodeId); - Assert.AreEqual(history.SeriesId, storedHistory.First().SeriesId); - Assert.AreEqual(history.NzbTitle, storedHistory.First().NzbTitle); - Assert.AreEqual(history.Indexer, storedHistory.First().Indexer); - Assert.AreEqual(history.Quality, storedHistory.First().Quality); - Assert.AreEqual(history.IsProper, storedHistory.First().IsProper); + history.Date.Should().BeWithin(TimeSpan.FromMinutes(1)).Before(storedHistory.First().Date); + + history.EpisodeId.Should().Be(storedHistory.First().EpisodeId); + history.SeriesId.Should().Be(storedHistory.First().SeriesId); + history.NzbTitle.Should().Be(storedHistory.First().NzbTitle); + history.Indexer.Should().Be(storedHistory.First().Indexer); + history.Quality.Should().Be(storedHistory.First().Quality); + history.IsProper.Should().Be(storedHistory.First().IsProper); } } } \ No newline at end of file diff --git a/NzbDrone.Core.Test/InventoryProvider_QualityNeededTest.cs b/NzbDrone.Core.Test/InventoryProvider_QualityNeededTest.cs index 3bf61ff62..455c71e33 100644 --- a/NzbDrone.Core.Test/InventoryProvider_QualityNeededTest.cs +++ b/NzbDrone.Core.Test/InventoryProvider_QualityNeededTest.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using AutoMoq; using FizzWare.NBuilder; +using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Core.Model; @@ -193,7 +194,7 @@ public void IsQualityNeeded_lesser_file_in_history_should_be_downloaded() bool result = mocker.Resolve().IsQualityNeeded(parseResultSingle); //Assert - Assert.IsTrue(result); + result.Should().BeTrue(); mocker.VerifyAllMocks(); } @@ -219,7 +220,7 @@ public void IsQualityNeeded_file_not_in_history_should_be_downloaded() bool result = mocker.Resolve().IsQualityNeeded(parseResultSingle); //Assert - Assert.IsTrue(result); + result.Should().BeTrue(); mocker.VerifyAllMocks(); } diff --git a/NzbDrone.Core.Test/JobProviderTest.cs b/NzbDrone.Core.Test/JobProviderTest.cs index f7ce7b08a..d46dfeb1a 100644 --- a/NzbDrone.Core.Test/JobProviderTest.cs +++ b/NzbDrone.Core.Test/JobProviderTest.cs @@ -33,7 +33,7 @@ public void Run_Jobs_Updates_Last_Execution() var settings = timerProvider.All(); Assert.IsNotEmpty(settings); Assert.AreNotEqual(DateTime.MinValue, settings[0].LastExecution); - Assert.IsTrue(settings[0].Success); + settings[0].Success.Should().BeTrue(); } [Test] @@ -75,9 +75,8 @@ public void can_run_job_again() var firstRun = timerProvider.RunScheduled(); var secondRun = timerProvider.RunScheduled(); - Assert.IsTrue(firstRun); - Assert.IsTrue(secondRun); - + firstRun.Should().BeTrue(); + secondRun.Should().BeTrue(); } [Test] @@ -97,9 +96,8 @@ public void can_run_async_job_again() Thread.Sleep(2000); var secondRun = timerProvider.QueueJob(typeof(FakeJob)); - Assert.IsTrue(firstRun); - Assert.IsTrue(secondRun); - + firstRun.Should().BeTrue(); + secondRun.Should().BeTrue(); } [Test] @@ -142,8 +140,8 @@ public void can_run_broken_async_job_again() Thread.Sleep(2000); var secondRun = timerProvider.QueueJob(typeof(BrokenJob)); - Assert.IsTrue(firstRun); - Assert.IsTrue(secondRun); + firstRun.Should().BeTrue(); + secondRun.Should().BeTrue(); Thread.Sleep(2000); ExceptionVerification.ExcpectedErrors(2); } @@ -174,7 +172,7 @@ public void can_run_two_jobs_at_the_same_time() thread1.Join(); thread2.Join(); - Assert.IsTrue(firstRun); + firstRun.Should().BeTrue(); Assert.IsFalse(secondRun); } @@ -230,13 +228,11 @@ public void Init_Jobs() //Assert timers.Should().HaveCount(1); - Assert.AreEqual(fakeTimer.DefaultInterval, timers[0].Interval); - Assert.AreEqual(fakeTimer.Name, timers[0].Name); - Assert.AreEqual(fakeTimer.GetType().ToString(), timers[0].TypeName); - Assert.AreEqual(DateTime.MinValue, timers[0].LastExecution); - Assert.IsTrue(timers[0].Enable); - - + timers[0].Interval.Should().Be(fakeTimer.DefaultInterval); + timers[0].Name.Should().Be(fakeTimer.Name); + timers[0].TypeName.Should().Be(fakeTimer.GetType().ToString()); + timers[0].LastExecution.Should().HaveYear(2000); + timers[0].Enable.Should().BeTrue(); } [Test] @@ -267,7 +263,7 @@ public void Init_Timers_only_registers_once() //Assert timers.Should().HaveCount(1); - Assert.IsTrue(timers[0].Enable); + timers[0].Enable.Should().BeTrue(); } [Test] @@ -364,8 +360,8 @@ public void SingleId_do_not_update_last_execution() //Assert var settings = timerProvider.All(); - Assert.IsNotEmpty(settings); - Assert.AreEqual(DateTime.MinValue, settings[0].LastExecution); + settings.Should().NotBeEmpty(); + settings[0].LastExecution.Should().HaveYear(2000); } [Test] diff --git a/NzbDrone.Core.Test/LogProviderTest.cs b/NzbDrone.Core.Test/LogProviderTest.cs index 35564a072..3a3b981b5 100644 --- a/NzbDrone.Core.Test/LogProviderTest.cs +++ b/NzbDrone.Core.Test/LogProviderTest.cs @@ -39,11 +39,10 @@ public void write_log() //Assert db.Fetch().Should().HaveCount(1); - var logItem = db.Fetch().First(); + var logItem = db.Fetch().First(); Assert.AreNotEqual(new DateTime(), logItem.Time); Assert.AreEqual(message, logItem.Message); Assert.AreEqual(Logger.Name, logItem.Logger); - Assert.AreEqual(Logger.Name, logItem.Logger); Assert.AreEqual(LogLevel.Info.Name, logItem.Level); Assert.AreEqual("write_log", logItem.Method); } @@ -149,14 +148,14 @@ public void write_log_exception_no_message_should_use_exception_message() } - + [Test] public void null_string_as_arg_should_not_fail() { //setup - + Logger Logger = LogManager.GetCurrentClassLogger(); var epFile = new EpisodeFile(); Logger.Trace("File {0} no longer exists on disk. removing from database.", epFile.Path); diff --git a/NzbDrone.Core.Test/QualityTest.cs b/NzbDrone.Core.Test/QualityTest.cs index 63bedfea7..42743d1c1 100644 --- a/NzbDrone.Core.Test/QualityTest.cs +++ b/NzbDrone.Core.Test/QualityTest.cs @@ -1,4 +1,5 @@ -using NUnit.Framework; +using FluentAssertions; +using NUnit.Framework; using NzbDrone.Core.Model; using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Test.Framework; @@ -55,9 +56,9 @@ public void equal_operand() var first = new Quality(QualityTypes.Bluray1080p, true); var second = new Quality(QualityTypes.Bluray1080p, true); - Assert.IsTrue(first == second); - Assert.IsTrue(first >= second); - Assert.IsTrue(first <= second); + (first == second).Should().BeTrue(); + (first >= second).Should().BeTrue(); + (first <= second).Should().BeTrue(); } [Test] @@ -66,7 +67,7 @@ public void equal_operand_false() var first = new Quality(QualityTypes.Bluray1080p, true); var second = new Quality(QualityTypes.Unknown, true); - Assert.IsFalse(first == second); + (first == second).Should().BeFalse(); } [Test] @@ -75,7 +76,7 @@ public void equal_operand_false_proper() var first = new Quality(QualityTypes.Bluray1080p, true); var second = new Quality(QualityTypes.Bluray1080p, false); - Assert.IsFalse(first == second); + (first == second).Should().BeFalse(); } @@ -94,7 +95,7 @@ public void not_equal_operand_false() var first = new Quality(QualityTypes.Bluray1080p, true); var second = new Quality(QualityTypes.Unknown, true); - Assert.IsTrue(first != second); + (first != second).Should().BeTrue(); } [Test] @@ -103,7 +104,7 @@ public void not_equal_operand_false_proper() var first = new Quality(QualityTypes.Bluray1080p, true); var second = new Quality(QualityTypes.Bluray1080p, false); - Assert.IsTrue(first != second); + (first != second).Should().BeTrue(); } [Test] @@ -112,8 +113,8 @@ public void greater_operand() var first = new Quality(QualityTypes.DVD, true); var second = new Quality(QualityTypes.Bluray1080p, true); - Assert.IsTrue(first < second); - Assert.IsTrue(first <= second); + (first < second).Should().BeTrue(); + (first <= second).Should().BeTrue(); } [Test] @@ -122,8 +123,8 @@ public void lesser_operand() var first = new Quality(QualityTypes.DVD, true); var second = new Quality(QualityTypes.Bluray1080p, true); - Assert.IsTrue(second > first); - Assert.IsTrue(second >= first); + (second > first).Should().BeTrue(); + (second >= first).Should().BeTrue(); } } diff --git a/NzbDrone.Core.Test/RootDirProviderTest.cs b/NzbDrone.Core.Test/RootDirProviderTest.cs index 7b492462c..b529b1fde 100644 --- a/NzbDrone.Core.Test/RootDirProviderTest.cs +++ b/NzbDrone.Core.Test/RootDirProviderTest.cs @@ -54,10 +54,9 @@ public void AddRootDir(string path) //Assert var rootDirs = rootDirProvider.GetAll(); - Assert.IsNotEmpty(rootDirs); - + rootDirs.Should().NotBeEmpty(); rootDirs.Should().HaveCount(1); - Assert.AreEqual(path, rootDirs.First().Path); + path.Should().Be(rootDirs.First().Path); } @@ -77,9 +76,8 @@ public void UpdateRootDir(string newPath) //Assert var rootDirs = rootDirProvider.GetAll(); - Assert.IsNotEmpty(rootDirs); rootDirs.Should().HaveCount(1); - Assert.AreEqual(newPath, rootDirs.First().Path); + newPath.Should().Be(rootDirs.First().Path); } [Test] @@ -115,8 +113,8 @@ public void GetRootDir() //Assert var rootDir = rootDirProvider.GetRootDir(id); - Assert.AreEqual(1, rootDir.Id); - Assert.AreEqual(path, rootDir.Path); + rootDir.Id.Should().Be(1); + rootDir.Path.Should().Be(path); } [Test] @@ -130,8 +128,8 @@ public void None_existing_folder_returns_empty_list() var result = mocker.Resolve().GetUnmappedFolders(path); - Assert.IsNotNull(result); - Assert.IsEmpty(result); + result.Should().NotBeNull(); + result.Should().BeEmpty(); mocker.VerifyAllMocks(); } diff --git a/NzbDrone.Core.Test/SabProviderTest.cs b/NzbDrone.Core.Test/SabProviderTest.cs index 92d8c3c90..4bc15f101 100644 --- a/NzbDrone.Core.Test/SabProviderTest.cs +++ b/NzbDrone.Core.Test/SabProviderTest.cs @@ -5,6 +5,7 @@ using System.Linq; using AutoMoq; using FizzWare.NBuilder; +using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Core.Model; @@ -63,7 +64,7 @@ public void AddByUrlSuccess() "http://www.nzbclub.com/nzb_download.aspx?mid=1950232", "This is an Nzb"); //Assert - Assert.IsTrue(result); + result.Should().BeTrue(); } @@ -110,7 +111,7 @@ public void AddByUrlNewzbin() "http://www.newzbin.com/browse/post/6107863/nzb", "This is an Nzb"); //Assert - Assert.IsTrue(result); + result.Should().BeTrue(); } [Test] @@ -187,7 +188,7 @@ public void IsInQueue_True() bool result = mocker.Resolve().IsInQueue("Ubuntu Test"); //Assert - Assert.IsTrue(result); + result.Should().BeTrue(); } [Test] @@ -332,7 +333,7 @@ public void AddNewzbingByUrlSuccess() "http://www.newzbin.com/browse/post/6107863/nzb", "Added by unit tests."); //Assert - Assert.IsTrue(result); + result.Should().BeTrue(); } } } \ No newline at end of file diff --git a/NzbDrone.Core.Test/SeriesProviderTest.cs b/NzbDrone.Core.Test/SeriesProviderTest.cs index 8e10dfeb6..2b032aa00 100644 --- a/NzbDrone.Core.Test/SeriesProviderTest.cs +++ b/NzbDrone.Core.Test/SeriesProviderTest.cs @@ -202,7 +202,7 @@ public void is_monitored() //Act, Assert var provider = mocker.Resolve(); - Assert.IsTrue(provider.IsMonitored(12)); + provider.IsMonitored(12).Should().BeTrue(); Assert.IsFalse(provider.IsMonitored(11)); Assert.IsFalse(provider.IsMonitored(1)); } diff --git a/NzbDrone.Core/Datastore/Connection.cs b/NzbDrone.Core/Datastore/Connection.cs index c1a1b2676..ad5ebb48f 100644 --- a/NzbDrone.Core/Datastore/Connection.cs +++ b/NzbDrone.Core/Datastore/Connection.cs @@ -2,6 +2,7 @@ using System.Data; using System.Data.Common; using System.Data.SQLite; +using System.Data.SqlServerCe; using System.IO; using MvcMiniProfiler.Data; using PetaPoco; @@ -21,14 +22,15 @@ static Connection() public static string GetConnectionString(string path) { - return String.Format("Data Source={0};Version=3;Cache Size=30000;Pooling=true;Default Timeout=2", path); + //return String.Format("Data Source={0};Version=3;Cache Size=30000;Pooling=true;Default Timeout=2", path); + return String.Format("Data Source={0}", path); } public static String MainConnectionString { get { - return GetConnectionString(Path.Combine(AppDataPath.FullName, "nzbdrone.db")); + return GetConnectionString(Path.Combine(AppDataPath.FullName, "nzbdrone.sdf")); } } @@ -36,7 +38,7 @@ public static String LogConnectionString { get { - return GetConnectionString(Path.Combine(AppDataPath.FullName, "log.db")); + return GetConnectionString(Path.Combine(AppDataPath.FullName, "log.sdf")); } } @@ -44,9 +46,9 @@ public static String LogConnectionString public static IDatabase GetPetaPocoDb(string connectionString, Boolean profiled = true) { MigrationsHelper.Run(connectionString, true); - var sqliteConnection = new SQLiteConnection(connectionString); + var sqliteConnection = new SqlCeConnection(connectionString); DbConnection connection = sqliteConnection; - + if (profiled) { connection = ProfiledDbConnection.Get(sqliteConnection); diff --git a/NzbDrone.Core/Datastore/Migrations/Migration20110619.cs b/NzbDrone.Core/Datastore/Migrations/Migration20110619.cs deleted file mode 100644 index 9be21b431..000000000 --- a/NzbDrone.Core/Datastore/Migrations/Migration20110619.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Data; -using Migrator.Framework; - -namespace NzbDrone.Core.Datastore.Migrations -{ - - [Migration(20110619)] - public class Migration20110619 : Migration - { - public override void Up() - { - if (Database.TableExists("Histories")) - { - Database.RemoveTable("Histories"); - } - } - - public override void Down() - { - throw new NotImplementedException(); - } - } -} \ No newline at end of file diff --git a/NzbDrone.Core/Datastore/Migrations/Migration20110616.cs b/NzbDrone.Core/Datastore/Migrations/Migration20110622.cs similarity index 91% rename from NzbDrone.Core/Datastore/Migrations/Migration20110616.cs rename to NzbDrone.Core/Datastore/Migrations/Migration20110622.cs index 0e70b03b6..94b9e93ff 100644 --- a/NzbDrone.Core/Datastore/Migrations/Migration20110616.cs +++ b/NzbDrone.Core/Datastore/Migrations/Migration20110622.cs @@ -5,8 +5,8 @@ namespace NzbDrone.Core.Datastore.Migrations { - [Migration(20110604)] - public class Migration20110616 : Migration + [Migration(20110622)] + public class Migration20110622 : Migration { public override void Up() { @@ -17,12 +17,12 @@ public override void Up() new Column("CleanTitle", DbType.String, ColumnProperty.Null), new Column("Status", DbType.String, ColumnProperty.Null), new Column("Overview", DbType.String, ColumnProperty.Null), - new Column("AirsDayOfWeek", DbType.Int16, ColumnProperty.Null), + new Column("AirsDayOfWeek", DbType.Int32, ColumnProperty.Null), new Column("AirTimes", DbType.String, ColumnProperty.Null), new Column("Language", DbType.String, ColumnProperty.Null), new Column("Path", DbType.String, ColumnProperty.NotNull), new Column("Monitored", DbType.Boolean, ColumnProperty.NotNull), - new Column("QualityProfileId", DbType.Int16, ColumnProperty.NotNull), + new Column("QualityProfileId", DbType.Int32, ColumnProperty.NotNull), new Column("SeasonFolder", DbType.Boolean, ColumnProperty.NotNull), new Column("LastInfoSync", DbType.DateTime, ColumnProperty.Null), new Column("LastDiskSync", DbType.DateTime, ColumnProperty.Null) @@ -33,8 +33,8 @@ public override void Up() new Column("EpisodeId", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity), new Column("TvDbEpisodeId", DbType.Int32, ColumnProperty.Null), new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull), - new Column("SeasonNumber", DbType.Int16, ColumnProperty.NotNull), - new Column("EpisodeNumber", DbType.Int16, ColumnProperty.NotNull), + new Column("SeasonNumber", DbType.Int32, ColumnProperty.NotNull), + new Column("EpisodeNumber", DbType.Int32, ColumnProperty.NotNull), new Column("Title", DbType.String, ColumnProperty.Null), new Column("Overview", DbType.String, ColumnProperty.Null), new Column("Ignored", DbType.Boolean, ColumnProperty.NotNull), @@ -50,11 +50,11 @@ public override void Up() ColumnProperty.PrimaryKeyWithIdentity), new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull), new Column("Path", DbType.String, ColumnProperty.NotNull), - new Column("Quality", DbType.Int16, ColumnProperty.NotNull), - new Column("Proper", DbType.Int16, ColumnProperty.NotNull), + new Column("Quality", DbType.Int32, ColumnProperty.NotNull), + new Column("Proper", DbType.Int32, ColumnProperty.NotNull), new Column("Size", DbType.Int64, ColumnProperty.NotNull), new Column("DateAdded", DbType.DateTime, ColumnProperty.NotNull), - new Column("SeasonNumber", DbType.Int16, ColumnProperty.NotNull) + new Column("SeasonNumber", DbType.Int32, ColumnProperty.NotNull) }); @@ -73,25 +73,25 @@ public override void Up() Database.AddTable("History", new[] { - new Column("HistoryId", DbType.Int64, ColumnProperty.PrimaryKey), + new Column("HistoryId", DbType.Int64, ColumnProperty.PrimaryKeyWithIdentity), new Column("EpisodeId", DbType.Int32, ColumnProperty.NotNull), new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull), new Column("NzbTitle", DbType.String, ColumnProperty.NotNull), new Column("Date", DbType.DateTime, ColumnProperty.NotNull), - new Column("Quality", DbType.Int16, ColumnProperty.NotNull), + new Column("Quality", DbType.Int32, ColumnProperty.NotNull), new Column("IsProper", DbType.Boolean, ColumnProperty.NotNull), new Column("Indexer", DbType.String, ColumnProperty.NotNull) }); Database.AddTable("RootDirs", new[] { - new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey), + new Column("Id", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity), new Column("Path", DbType.String, ColumnProperty.NotNull) }); Database.AddTable("ExternalNotificationSettings", new[] { - new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey), + new Column("Id", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity), new Column("Enabled", DbType.Boolean, ColumnProperty.NotNull), new Column("NotifierName", DbType.String, ColumnProperty.NotNull), new Column("Name", DbType.String, ColumnProperty.NotNull) @@ -99,7 +99,7 @@ public override void Up() Database.AddTable("JobSettings", new[] { - new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey), + new Column("Id", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity), new Column("Enable", DbType.Boolean, ColumnProperty.NotNull), new Column("TypeName", DbType.String, ColumnProperty.NotNull), new Column("Name", DbType.String, ColumnProperty.NotNull), @@ -110,7 +110,7 @@ public override void Up() Database.AddTable("QualityProfiles", new[] { - new Column("QualityProfileId", DbType.Int32, ColumnProperty.PrimaryKey), + new Column("QualityProfileId", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity), new Column("Name", DbType.String, ColumnProperty.NotNull), new Column("Cutoff", DbType.Int32, ColumnProperty.NotNull), new Column("SonicAllowed", DbType.String, ColumnProperty.NotNull), @@ -118,7 +118,7 @@ public override void Up() Database.AddTable("Logs", new[] { - new Column("LogId", DbType.Int64, ColumnProperty.PrimaryKey), + new Column("LogId", DbType.Int64, ColumnProperty.PrimaryKeyWithIdentity), new Column("Message", DbType.String, ColumnProperty.NotNull), new Column("Time", DbType.DateTime, ColumnProperty.NotNull), new Column("Logger", DbType.String, ColumnProperty.NotNull), @@ -130,7 +130,7 @@ public override void Up() Database.AddTable("IndexerSettings", new[] { - new Column("Id", DbType.Int32, ColumnProperty.PrimaryKey), + new Column("Id", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity), new Column("Enable", DbType.Boolean, ColumnProperty.NotNull), new Column("IndexProviderType", DbType.String, ColumnProperty.NotNull), new Column("Name", DbType.String, ColumnProperty.NotNull), diff --git a/NzbDrone.Core/Datastore/MigrationsHelper.cs b/NzbDrone.Core/Datastore/MigrationsHelper.cs index ed0249417..4ca071790 100644 --- a/NzbDrone.Core/Datastore/MigrationsHelper.cs +++ b/NzbDrone.Core/Datastore/MigrationsHelper.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Data.SqlServerCe; +using System.IO; using System.Reflection; using NLog; @@ -16,6 +18,8 @@ public static void Run(string connetionString, bool trace) if (_migrated.ContainsKey(connetionString)) return; _migrated.Add(connetionString, string.Empty); + EnsureDatabase(connetionString); + Logger.Info("Preparing run database migration"); try @@ -23,11 +27,11 @@ public static void Run(string connetionString, bool trace) Migrator.Migrator migrator; if (trace) { - migrator = new Migrator.Migrator("Sqlite", connetionString, Assembly.GetAssembly(typeof(MigrationsHelper)), true, new MigrationLogger()); + migrator = new Migrator.Migrator("sqlserverce", connetionString, Assembly.GetAssembly(typeof(MigrationsHelper)), true, new MigrationLogger()); } else { - migrator = new Migrator.Migrator("Sqlite", connetionString, Assembly.GetAssembly(typeof(MigrationsHelper))); + migrator = new Migrator.Migrator("sqlserverce", connetionString, Assembly.GetAssembly(typeof(MigrationsHelper))); } @@ -46,8 +50,18 @@ public static void Run(string connetionString, bool trace) } } - + private static void EnsureDatabase(string constr) + { + var connection = new SqlCeConnection(constr); + if (!File.Exists(connection.Database)) + { + var engine = new SqlCeEngine(constr); + engine.CreateDatabase(); + } + } } + + } \ No newline at end of file diff --git a/NzbDrone.Core/Datastore/PetaPoco/PetaPoco.cs b/NzbDrone.Core/Datastore/PetaPoco/PetaPoco.cs index 5a910df6d..e193fdff4 100644 --- a/NzbDrone.Core/Datastore/PetaPoco/PetaPoco.cs +++ b/NzbDrone.Core/Datastore/PetaPoco/PetaPoco.cs @@ -24,6 +24,7 @@ using System.Text; using System.Text.RegularExpressions; using System.Threading; +using MvcMiniProfiler; namespace PetaPoco { @@ -316,7 +317,7 @@ enum DBType Oracle, SQLite } - DBType _dbType = DBType.SQLite; + DBType _dbType = DBType.SqlServerCE; // Common initialization private void CommonConstruct() @@ -645,28 +646,31 @@ public int Execute(string sql, params object[] args) public int Execute(Sql sql) { - try + using (MiniProfiler.StepStatic("Peta Execute SQL")) { - OpenSharedConnection(); try { - using (var cmd = CreateCommand(_sharedConnection, sql)) + OpenSharedConnection(); + try { - var result = cmd.ExecuteNonQuery(); - OnExecutedCommand(cmd); - return result; + using (var cmd = CreateCommand(_sharedConnection, sql)) + { + var result = cmd.ExecuteNonQuery(); + OnExecutedCommand(cmd); + return result; + } + } + finally + { + CloseSharedConnection(); } } - finally + catch (Exception x) { - CloseSharedConnection(); + OnException(x); + throw; } } - catch (Exception x) - { - OnException(x); - throw; - } } // Execute and cast a scalar property @@ -677,28 +681,31 @@ public T ExecuteScalar(string sql, params object[] args) public T ExecuteScalar(Sql sql) { - try + using (MiniProfiler.StepStatic("Peta ExecuteScalar")) { - OpenSharedConnection(); try { - using (var cmd = CreateCommand(_sharedConnection, sql)) + OpenSharedConnection(); + try { - object val = cmd.ExecuteScalar(); - OnExecutedCommand(cmd); - return (T)Convert.ChangeType(val, typeof(T)); + using (var cmd = CreateCommand(_sharedConnection, sql)) + { + object val = cmd.ExecuteScalar(); + OnExecutedCommand(cmd); + return (T)Convert.ChangeType(val, typeof(T)); + } + } + finally + { + CloseSharedConnection(); } } - finally + catch (Exception x) { - CloseSharedConnection(); + OnException(x); + throw; } } - catch (Exception x) - { - OnException(x); - throw; - } } Regex rxSelect = new Regex(@"\A\s*(SELECT|EXECUTE|CALL)\s", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Multiline); @@ -887,50 +894,55 @@ public IEnumerable Query(string sql, params object[] args) public IEnumerable Query(Sql sql) { - OpenSharedConnection(); - try + using (MiniProfiler.StepStatic("Peta Query SQL")) { - using (var cmd = CreateCommand(_sharedConnection, sql)) + OpenSharedConnection(); + try { - IDataReader r; - var pd = PocoData.ForType(typeof(T)); - try + using (var cmd = CreateCommand(_sharedConnection, sql)) { - r = cmd.ExecuteReader(); - OnExecutedCommand(cmd); - } - catch (Exception x) - { - OnException(x); - throw; - } - - using (r) - { - var factory = pd.GetFactory(cmd.CommandText, _sharedConnection.ConnectionString, ForceDateTimesToUtc, 0, r.FieldCount, r) as Func; - while (true) + IDataReader r; + var pd = PocoData.ForType(typeof(T)); + try { - T poco; - try - { - if (!r.Read()) - yield break; - poco = factory(r); - } - catch (Exception x) - { - OnException(x); - throw; - } + r = cmd.ExecuteReader(); + OnExecutedCommand(cmd); + } + catch (Exception x) + { + OnException(x); + throw; + } - yield return poco; + using (r) + { + var factory = + pd.GetFactory(cmd.CommandText, _sharedConnection.ConnectionString, ForceDateTimesToUtc, 0, r.FieldCount, r) + as Func; + while (true) + { + T poco; + try + { + if (!r.Read()) + yield break; + poco = factory(r); + } + catch (Exception x) + { + OnException(x); + throw; + } + + yield return poco; + } } } } - } - finally - { - CloseSharedConnection(); + finally + { + CloseSharedConnection(); + } } } @@ -1181,62 +1193,65 @@ Func GetMultiPocoFactory(Type[] types, string s // Actual implementation of the multi-poco query public IEnumerable Query(Type[] types, object cb, string sql, params object[] args) { - OpenSharedConnection(); - try + using (MiniProfiler.StepStatic("Peta Query Type[]")) { - using (var cmd = CreateCommand(_sharedConnection, sql, args)) + OpenSharedConnection(); + try { - IDataReader r; - try + using (var cmd = CreateCommand(_sharedConnection, sql, args)) { - r = cmd.ExecuteReader(); - OnExecutedCommand(cmd); - } - catch (Exception x) - { - OnException(x); - throw; - } - var factory = GetMultiPocoFactory(types, sql, r); - if (cb == null) - cb = GetAutoMapper(types.ToArray()); - bool bNeedTerminator = false; - using (r) - { - while (true) + IDataReader r; + try { - TRet poco; - try - { - if (!r.Read()) - break; - poco = factory(r, cb); - } - catch (Exception x) - { - OnException(x); - throw; - } - - if (poco != null) - yield return poco; - else - bNeedTerminator = true; + r = cmd.ExecuteReader(); + OnExecutedCommand(cmd); } - if (bNeedTerminator) + catch (Exception x) { - var poco = (TRet)(cb as Delegate).DynamicInvoke(new object[types.Length]); - if (poco != null) - yield return poco; - else - yield break; + OnException(x); + throw; + } + var factory = GetMultiPocoFactory(types, sql, r); + if (cb == null) + cb = GetAutoMapper(types.ToArray()); + bool bNeedTerminator = false; + using (r) + { + while (true) + { + TRet poco; + try + { + if (!r.Read()) + break; + poco = factory(r, cb); + } + catch (Exception x) + { + OnException(x); + throw; + } + + if (poco != null) + yield return poco; + else + bNeedTerminator = true; + } + if (bNeedTerminator) + { + var poco = (TRet)(cb as Delegate).DynamicInvoke(new object[types.Length]); + if (poco != null) + yield return poco; + else + yield break; + } } } } - } - finally - { - CloseSharedConnection(); + finally + { + CloseSharedConnection(); + } } } @@ -1355,172 +1370,175 @@ public object Insert(string tableName, string primaryKeyName, object poco) // the new id is returned. public object Insert(string tableName, string primaryKeyName, bool autoIncrement, object poco) { - try + using (MiniProfiler.StepStatic("Peta Insert " + tableName)) { - OpenSharedConnection(); try { - using (var cmd = CreateCommand(_sharedConnection, "")) + OpenSharedConnection(); + try { - var pd = PocoData.ForObject(poco, primaryKeyName); - var names = new List(); - var values = new List(); - var index = 0; - var versionName = ""; - - foreach (var i in pd.Columns) + using (var cmd = CreateCommand(_sharedConnection, "")) { - // Don't insert result columns - if (i.Value.ResultColumn) - continue; + var pd = PocoData.ForObject(poco, primaryKeyName); + var names = new List(); + var values = new List(); + var index = 0; + var versionName = ""; - // Don't insert the primary key (except under oracle where we need bring in the next sequence value) - if (autoIncrement && primaryKeyName != null && string.Compare(i.Key, primaryKeyName, true) == 0) + foreach (var i in pd.Columns) { - if (_dbType == DBType.Oracle && !string.IsNullOrEmpty(pd.TableInfo.SequenceName)) + // Don't insert result columns + if (i.Value.ResultColumn) + continue; + + // Don't insert the primary key (except under oracle where we need bring in the next sequence value) + if (autoIncrement && primaryKeyName != null && string.Compare(i.Key, primaryKeyName, true) == 0) { - names.Add(i.Key); - values.Add(string.Format("{0}.nextval", pd.TableInfo.SequenceName)); + if (_dbType == DBType.Oracle && !string.IsNullOrEmpty(pd.TableInfo.SequenceName)) + { + names.Add(i.Key); + values.Add(string.Format("{0}.nextval", pd.TableInfo.SequenceName)); + } + continue; } - continue; + + names.Add(EscapeSqlIdentifier(i.Key)); + values.Add(string.Format("{0}{1}", _paramPrefix, index++)); + + object val = i.Value.GetValue(poco); + if (i.Value.VersionColumn) + { + val = 1; + versionName = i.Key; + } + + AddParam(cmd, val, _paramPrefix); } - names.Add(EscapeSqlIdentifier(i.Key)); - values.Add(string.Format("{0}{1}", _paramPrefix, index++)); - - object val = i.Value.GetValue(poco); - if (i.Value.VersionColumn) - { - val = 1; - versionName = i.Key; - } - - AddParam(cmd, val, _paramPrefix); - } - - cmd.CommandText = string.Format("INSERT INTO {0} ({1}) VALUES ({2})", - EscapeTableName(tableName), - string.Join(",", names.ToArray()), - string.Join(",", values.ToArray()) + cmd.CommandText = string.Format("INSERT INTO {0} ({1}) VALUES ({2})", + EscapeTableName(tableName), + string.Join(",", names.ToArray()), + string.Join(",", values.ToArray()) ); - if (!autoIncrement) - { - DoPreExecute(cmd); - cmd.ExecuteNonQuery(); - OnExecutedCommand(cmd); - return true; - } - - object id; - - switch (_dbType) - { - case DBType.SqlServerCE: + if (!autoIncrement) + { DoPreExecute(cmd); cmd.ExecuteNonQuery(); OnExecutedCommand(cmd); - id = ExecuteScalar("SELECT @@@IDENTITY AS NewID;"); - break; - case DBType.SqlServer: - cmd.CommandText += ";\nSELECT SCOPE_IDENTITY() AS NewID;"; - DoPreExecute(cmd); - id = cmd.ExecuteScalar(); - OnExecutedCommand(cmd); - break; - case DBType.PostgreSQL: - if (primaryKeyName != null) - { - cmd.CommandText += string.Format("returning {0} as NewID", EscapeSqlIdentifier(primaryKeyName)); + return true; + } + + object id; + + switch (_dbType) + { + case DBType.SqlServerCE: + DoPreExecute(cmd); + cmd.ExecuteNonQuery(); + OnExecutedCommand(cmd); + id = ExecuteScalar("SELECT @@@IDENTITY AS NewID;"); + break; + case DBType.SqlServer: + cmd.CommandText += ";\nSELECT SCOPE_IDENTITY() AS NewID;"; DoPreExecute(cmd); id = cmd.ExecuteScalar(); - } - else - { - id = -1; - DoPreExecute(cmd); - cmd.ExecuteNonQuery(); - } - OnExecutedCommand(cmd); - break; - case DBType.Oracle: - if (primaryKeyName != null) - { - cmd.CommandText += string.Format(" returning {0} into :newid", EscapeSqlIdentifier(primaryKeyName)); - var param = cmd.CreateParameter(); - param.ParameterName = ":newid"; - param.Value = DBNull.Value; - param.Direction = ParameterDirection.ReturnValue; - param.DbType = DbType.Int64; - cmd.Parameters.Add(param); - DoPreExecute(cmd); - cmd.ExecuteNonQuery(); - id = param.Value; - } - else - { - id = -1; - DoPreExecute(cmd); - cmd.ExecuteNonQuery(); - } - OnExecutedCommand(cmd); - break; - case DBType.SQLite: - if (primaryKeyName != null) - { - cmd.CommandText += ";\nSELECT last_insert_rowid();"; + OnExecutedCommand(cmd); + break; + case DBType.PostgreSQL: + if (primaryKeyName != null) + { + cmd.CommandText += string.Format("returning {0} as NewID", EscapeSqlIdentifier(primaryKeyName)); + DoPreExecute(cmd); + id = cmd.ExecuteScalar(); + } + else + { + id = -1; + DoPreExecute(cmd); + cmd.ExecuteNonQuery(); + } + OnExecutedCommand(cmd); + break; + case DBType.Oracle: + if (primaryKeyName != null) + { + cmd.CommandText += string.Format(" returning {0} into :newid", EscapeSqlIdentifier(primaryKeyName)); + var param = cmd.CreateParameter(); + param.ParameterName = ":newid"; + param.Value = DBNull.Value; + param.Direction = ParameterDirection.ReturnValue; + param.DbType = DbType.Int64; + cmd.Parameters.Add(param); + DoPreExecute(cmd); + cmd.ExecuteNonQuery(); + id = param.Value; + } + else + { + id = -1; + DoPreExecute(cmd); + cmd.ExecuteNonQuery(); + } + OnExecutedCommand(cmd); + break; + case DBType.SQLite: + if (primaryKeyName != null) + { + cmd.CommandText += ";\nSELECT last_insert_rowid();"; + DoPreExecute(cmd); + id = cmd.ExecuteScalar(); + } + else + { + id = -1; + DoPreExecute(cmd); + cmd.ExecuteNonQuery(); + } + OnExecutedCommand(cmd); + break; + default: + cmd.CommandText += ";\nSELECT @@IDENTITY AS NewID;"; DoPreExecute(cmd); id = cmd.ExecuteScalar(); - } - else + OnExecutedCommand(cmd); + break; + } + + // Assign the ID back to the primary key property + if (primaryKeyName != null) + { + PocoColumn pc; + if (pd.Columns.TryGetValue(primaryKeyName, out pc)) { - id = -1; - DoPreExecute(cmd); - cmd.ExecuteNonQuery(); + pc.SetValue(poco, pc.ChangeType(id)); } - OnExecutedCommand(cmd); - break; - default: - cmd.CommandText += ";\nSELECT @@IDENTITY AS NewID;"; - DoPreExecute(cmd); - id = cmd.ExecuteScalar(); - OnExecutedCommand(cmd); - break; - } - - // Assign the ID back to the primary key property - if (primaryKeyName != null) - { - PocoColumn pc; - if (pd.Columns.TryGetValue(primaryKeyName, out pc)) - { - pc.SetValue(poco, pc.ChangeType(id)); } - } - // Assign the Version column - if (!string.IsNullOrEmpty(versionName)) - { - PocoColumn pc; - if (pd.Columns.TryGetValue(versionName, out pc)) + // Assign the Version column + if (!string.IsNullOrEmpty(versionName)) { - pc.SetValue(poco, pc.ChangeType(1)); + PocoColumn pc; + if (pd.Columns.TryGetValue(versionName, out pc)) + { + pc.SetValue(poco, pc.ChangeType(1)); + } } - } - return id; + return id; + } + } + finally + { + CloseSharedConnection(); } } - finally + catch (Exception x) { - CloseSharedConnection(); + OnException(x); + throw; } } - catch (Exception x) - { - OnException(x); - throw; - } } // Insert an annotated poco object @@ -1546,95 +1564,102 @@ public void InsertMany(IEnumerable pocoList) // Update a record with values from a poco. primary key value can be either supplied or read from the poco public int Update(string tableName, string primaryKeyName, object poco, object primaryKeyValue) { - try + using (MiniProfiler.StepStatic("Peta Update " + tableName)) { - OpenSharedConnection(); try { - using (var cmd = CreateCommand(_sharedConnection, "")) + OpenSharedConnection(); + try { - var sb = new StringBuilder(); - var index = 0; - var pd = PocoData.ForObject(poco, primaryKeyName); - string versionName = null; - object versionValue = null; - - var primaryKeyValuePairs = GetPrimaryKeyValues(primaryKeyName, primaryKeyValue); - - foreach (var i in pd.Columns) + using (var cmd = CreateCommand(_sharedConnection, "")) { - // Don't update the primary key, but grab the value if we don't have it - if (primaryKeyValue == null && primaryKeyValuePairs.ContainsKey(i.Key)) + var sb = new StringBuilder(); + var index = 0; + var pd = PocoData.ForObject(poco, primaryKeyName); + string versionName = null; + object versionValue = null; + + var primaryKeyValuePairs = GetPrimaryKeyValues(primaryKeyName, primaryKeyValue); + + foreach (var i in pd.Columns) { - primaryKeyValuePairs[i.Key] = i.Value.PropertyInfo.GetValue(poco, null); - continue; + // Don't update the primary key, but grab the value if we don't have it + if (primaryKeyValue == null && primaryKeyValuePairs.ContainsKey(i.Key)) + { + primaryKeyValuePairs[i.Key] = i.Value.PropertyInfo.GetValue(poco, null); + continue; + } + + // Dont update result only columns + if (i.Value.ResultColumn) + continue; + + object value = i.Value.PropertyInfo.GetValue(poco, null); + + if (i.Value.VersionColumn) + { + versionName = i.Key; + versionValue = value; + value = Convert.ToInt64(value) + 1; + } + + // Build the sql + if (index > 0) + sb.Append(", "); + sb.AppendFormat("{0} = {1}{2}", EscapeSqlIdentifier(i.Key), _paramPrefix, index++); + + // Store the parameter in the command + AddParam(cmd, value, _paramPrefix); } - // Dont update result only columns - if (i.Value.ResultColumn) - continue; + cmd.CommandText = string.Format("UPDATE {0} SET {1} WHERE {2}", + EscapeSqlIdentifier(tableName), sb.ToString(), + BuildPrimaryKeySql(primaryKeyValuePairs, ref index)); - object value = i.Value.PropertyInfo.GetValue(poco, null); - - if (i.Value.VersionColumn) + foreach (var keyValue in primaryKeyValuePairs) { - versionName = i.Key; - versionValue = value; - value = Convert.ToInt64(value) + 1; + AddParam(cmd, keyValue.Value, _paramPrefix); } - // Build the sql - if (index > 0) - sb.Append(", "); - sb.AppendFormat("{0} = {1}{2}", EscapeSqlIdentifier(i.Key), _paramPrefix, index++); - - // Store the parameter in the command - AddParam(cmd, value, _paramPrefix); - } - - cmd.CommandText = string.Format("UPDATE {0} SET {1} WHERE {2}", - EscapeSqlIdentifier(tableName), sb.ToString(), BuildPrimaryKeySql(primaryKeyValuePairs, ref index)); - - foreach (var keyValue in primaryKeyValuePairs) - { - AddParam(cmd, keyValue.Value, _paramPrefix); - } - - if (!string.IsNullOrEmpty(versionName)) - { - cmd.CommandText += string.Format(" AND {0} = {1}{2}", EscapeSqlIdentifier(versionName), _paramPrefix, index++); - AddParam(cmd, versionValue, _paramPrefix); - } - - DoPreExecute(cmd); - - // Do it - var result = cmd.ExecuteNonQuery(); - OnExecutedCommand(cmd); - - // Set Version - if (!string.IsNullOrEmpty(versionName)) - { - PocoColumn pc; - if (pd.Columns.TryGetValue(versionName, out pc)) + if (!string.IsNullOrEmpty(versionName)) { - pc.PropertyInfo.SetValue(poco, Convert.ChangeType(Convert.ToInt64(versionValue) + 1, pc.PropertyInfo.PropertyType), null); + cmd.CommandText += string.Format(" AND {0} = {1}{2}", EscapeSqlIdentifier(versionName), _paramPrefix, + index++); + AddParam(cmd, versionValue, _paramPrefix); } - } - return result; + DoPreExecute(cmd); + + // Do it + var result = cmd.ExecuteNonQuery(); + OnExecutedCommand(cmd); + + // Set Version + if (!string.IsNullOrEmpty(versionName)) + { + PocoColumn pc; + if (pd.Columns.TryGetValue(versionName, out pc)) + { + pc.PropertyInfo.SetValue(poco, + Convert.ChangeType(Convert.ToInt64(versionValue) + 1, + pc.PropertyInfo.PropertyType), null); + } + } + + return result; + } + } + finally + { + CloseSharedConnection(); } } - finally + catch (Exception x) { - CloseSharedConnection(); + OnException(x); + throw; } } - catch (Exception x) - { - OnException(x); - throw; - } } private string BuildPrimaryKeySql(Dictionary primaryKeyValuePair, ref int index) diff --git a/NzbDrone.Core/Instrumentation/SubsonicTarget.cs b/NzbDrone.Core/Instrumentation/SubsonicTarget.cs index 261be609c..ff9a2a3fe 100644 --- a/NzbDrone.Core/Instrumentation/SubsonicTarget.cs +++ b/NzbDrone.Core/Instrumentation/SubsonicTarget.cs @@ -1,10 +1,12 @@ using System; using NLog; using NLog.Targets; +using NLog.Targets.Wrappers; using PetaPoco; namespace NzbDrone.Core.Instrumentation { + public class SubsonicTarget : Target { private readonly IDatabase _database; @@ -14,6 +16,8 @@ public SubsonicTarget(IDatabase database) _database = database; } + + protected override void Write(LogEventInfo logEvent) { var log = new Log(); diff --git a/NzbDrone.Core/Model/EpisodeParseResult.cs b/NzbDrone.Core/Model/EpisodeParseResult.cs index 9c9818d82..c374cd3ff 100644 --- a/NzbDrone.Core/Model/EpisodeParseResult.cs +++ b/NzbDrone.Core/Model/EpisodeParseResult.cs @@ -7,14 +7,14 @@ namespace NzbDrone.Core.Model public class EpisodeParseResult { internal string CleanTitle { get; set; } - + public string EpisodeTitle { get; set; } internal int SeasonNumber { get; set; } internal List EpisodeNumbers { get; set; } - internal DateTime AirDate { get; set; } + internal DateTime? AirDate { get; set; } public Quality Quality { get; set; } @@ -30,11 +30,14 @@ public class EpisodeParseResult public override string ToString() { - if (EpisodeNumbers == null) - return string.Format("{0} - {1} {2}", CleanTitle, AirDate.ToShortDateString(), Quality); + if (AirDate != null && EpisodeNumbers == null) + return string.Format("{0} - {1} {2}", CleanTitle, AirDate.Value.ToShortDateString(), Quality); - return string.Format("{0} - S{1:00}E{2} {3}", CleanTitle, SeasonNumber, - String.Join("-", EpisodeNumbers), Quality); + if (EpisodeNumbers != null) + return string.Format("{0} - S{1:00}E{2} {3}", CleanTitle, SeasonNumber, + String.Join("-", EpisodeNumbers), Quality); + + return NzbTitle; } } diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index a4b8db683..6bf38e5a4 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -159,6 +159,7 @@ False ..\Libraries\System.Data.SQLite.dll + @@ -176,8 +177,7 @@ - - + diff --git a/NzbDrone.Core/Providers/Core/ConfigProvider.cs b/NzbDrone.Core/Providers/Core/ConfigProvider.cs index 298cb0738..2555c3d86 100644 --- a/NzbDrone.Core/Providers/Core/ConfigProvider.cs +++ b/NzbDrone.Core/Providers/Core/ConfigProvider.cs @@ -278,7 +278,7 @@ public virtual string GetValue(string key, object defaultValue) { string value; - var dbValue = _database.SingleOrDefault("WHERE Key=@0", key); + var dbValue = _database.SingleOrDefault("WHERE [Key] =@0", key); if (dbValue != null && !String.IsNullOrEmpty(dbValue.Value)) return dbValue.Value; @@ -308,7 +308,7 @@ public virtual void SetValue(string key, string value) Logger.Debug("Writing Setting to file. Key:'{0}' Value:'{1}'", key, value); - var dbValue = _database.SingleOrDefault("WHERE KEY=@0", key); + var dbValue = _database.SingleOrDefault("WHERE [KEY]=@0", key); if (dbValue == null) { @@ -317,7 +317,11 @@ public virtual void SetValue(string key, string value) else { dbValue.Value = value; - _database.Update(dbValue); + using (var tran = _database.GetTransaction()) + { + _database.Update(dbValue); + tran.Complete(); + } } } } diff --git a/NzbDrone.Core/Providers/EpisodeProvider.cs b/NzbDrone.Core/Providers/EpisodeProvider.cs index 08e9526a3..3296cb16b 100644 --- a/NzbDrone.Core/Providers/EpisodeProvider.cs +++ b/NzbDrone.Core/Providers/EpisodeProvider.cs @@ -113,9 +113,9 @@ public virtual IList GetEpisodesByParseResult(EpisodeParseResult parseR foreach (var episodeNumber in parseResult.EpisodeNumbers) { var episodeInfo = GetEpisode(parseResult.Series.SeriesId, parseResult.SeasonNumber, episodeNumber); - if (episodeInfo == null) + if (episodeInfo == null && parseResult.AirDate != null) { - episodeInfo = GetEpisode(parseResult.Series.SeriesId, parseResult.AirDate); + episodeInfo = GetEpisode(parseResult.Series.SeriesId, parseResult.AirDate.Value); } //if still null we should add the temp episode if (episodeInfo == null && autoAddNew) @@ -209,12 +209,16 @@ public virtual void RefreshEpisodeInfo(Series series) episodeToUpdate.SeriesId = series.SeriesId; episodeToUpdate.TvDbEpisodeId = episode.Id; - episodeToUpdate.AirDate = episode.FirstAired.Date; episodeToUpdate.EpisodeNumber = episode.EpisodeNumber; episodeToUpdate.SeasonNumber = episode.SeasonNumber; episodeToUpdate.Title = episode.EpisodeName; episodeToUpdate.Overview = episode.Overview; + if (episode.FirstAired.Year > 1900) + { + episodeToUpdate.AirDate = episode.FirstAired.Date; + } + successCount++; } catch (Exception e) diff --git a/NzbDrone.Core/Providers/Jobs/JobProvider.cs b/NzbDrone.Core/Providers/Jobs/JobProvider.cs index da6c054e4..ed19fa093 100644 --- a/NzbDrone.Core/Providers/Jobs/JobProvider.cs +++ b/NzbDrone.Core/Providers/Jobs/JobProvider.cs @@ -292,7 +292,7 @@ public virtual void Initialize() TypeName = timer.GetType().ToString(), Name = timerProviderLocal.Name, Interval = timerProviderLocal.DefaultInterval, - LastExecution = DateTime.MinValue + LastExecution = new DateTime(2000, 1, 1) }; SaveSettings(settings); diff --git a/NzbDrone.Core/Providers/MediaFileProvider.cs b/NzbDrone.Core/Providers/MediaFileProvider.cs index 2429cd71b..991a90d15 100644 --- a/NzbDrone.Core/Providers/MediaFileProvider.cs +++ b/NzbDrone.Core/Providers/MediaFileProvider.cs @@ -72,7 +72,7 @@ public virtual Tuple GetEpisodeFilesCount(int seriesId) { var allEpisodes = _episodeProvider.GetEpisodeBySeries(seriesId).ToList(); - var episodeTotal = allEpisodes.Where(e => !e.Ignored && e.AirDate <= DateTime.Today && e.AirDate.Year > 1900).ToList(); + var episodeTotal = allEpisodes.Where(e => !e.Ignored && e.AirDate != null && e.AirDate <= DateTime.Today).ToList(); var avilableEpisodes = episodeTotal.Where(e => e.EpisodeFileId > 0).ToList(); return new Tuple(avilableEpisodes.Count, episodeTotal.Count); diff --git a/NzbDrone.Core/Providers/SeriesProvider.cs b/NzbDrone.Core/Providers/SeriesProvider.cs index 896f09a02..1bde249df 100644 --- a/NzbDrone.Core/Providers/SeriesProvider.cs +++ b/NzbDrone.Core/Providers/SeriesProvider.cs @@ -49,14 +49,15 @@ public virtual IList GetAllSeriesWithEpisodeCount(bool ignoreSpecials) if (!ignoreSpecials) seasonNumber = -1; - var series = _database.Fetch(@"SELECT Series.*, COUNT (NULLIF(Ignored, 1)) AS EpisodeCount, - SUM(CASE WHEN Ignored = 0 AND EpisodeFileId > 0 THEN 1 ELSE 0 END) as EpisodeFileCount, - COUNT (DISTINCT(NULLIF(SeasonNumber, @0))) as SeasonCount, - QualityProfiles.* - FROM Series - INNER JOIN QualityProfiles ON Series.QualityProfileId = QualityProfiles.QualityProfileId - JOIN Episodes ON Series.SeriesId = Episodes.SeriesId - GROUP BY seriesId", seasonNumber); + var series = _database + .Fetch(@"SELECT Series.*, SUM(CASE WHEN Ignored = 0 THEN 1 ELSE 0 END) AS EpisodeCount, +SUM(CASE WHEN Ignored = 0 AND EpisodeFileId > 0 THEN 1 ELSE 0 END) as EpisodeFileCount, +COUNT (DISTINCT(CASE WHEN SeasonNumber = 0 THEN null ELSE SeasonNumber END)) as SeasonCount, +QualityProfiles.* +FROM Series +INNER JOIN QualityProfiles ON Series.QualityProfileId = QualityProfiles.QualityProfileId +JOIN Episodes ON Series.SeriesId = Episodes.SeriesId +GROUP BY seriesId"); return series; } diff --git a/NzbDrone.Core/Repository/Episode.cs b/NzbDrone.Core/Repository/Episode.cs index f5ce16816..18b6173f4 100644 --- a/NzbDrone.Core/Repository/Episode.cs +++ b/NzbDrone.Core/Repository/Episode.cs @@ -17,7 +17,7 @@ public class Episode public int SeasonNumber { get; set; } public int EpisodeNumber { get; set; } public string Title { get; set; } - public DateTime AirDate { get; set; } + public DateTime? AirDate { get; set; } public string Overview { get; set; } @@ -47,7 +47,7 @@ public EpisodeStatusType Status if (Ignored) return EpisodeStatusType.Ignored; - if (AirDate.Date.Year > 1900 && DateTime.Now.Date >= AirDate.Date) + if (AirDate != null && AirDate.Value.Date < DateTime.Now) { return EpisodeStatusType.Missing; } diff --git a/NzbDrone.Web/Controllers/MissingController.cs b/NzbDrone.Web/Controllers/MissingController.cs index 85ff4997d..6b94dce08 100644 --- a/NzbDrone.Web/Controllers/MissingController.cs +++ b/NzbDrone.Web/Controllers/MissingController.cs @@ -37,7 +37,7 @@ public ActionResult _AjaxBinding() EpisodeTitle = e.Title, Overview = e.Overview, SeriesTitle = e.Series.Title, - AirDate = e.AirDate, + AirDate = e.AirDate.Value, }); return View(new GridModel(missing)); diff --git a/NzbDrone.Web/Controllers/SeriesController.cs b/NzbDrone.Web/Controllers/SeriesController.cs index ed892ca8f..725eb7b88 100644 --- a/NzbDrone.Web/Controllers/SeriesController.cs +++ b/NzbDrone.Web/Controllers/SeriesController.cs @@ -3,6 +3,7 @@ using System.IO; using System.Linq; using System.Web.Mvc; +using MvcMiniProfiler; using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.Jobs; using NzbDrone.Core.Repository; @@ -119,8 +120,11 @@ public ActionResult _DeleteAjaxSeriesEditing(int id) [GridAction] public ActionResult _AjaxSeasonGrid(int seriesId, int seasonNumber) { - var episodes = GetEpisodeModels(_episodeProvider.GetEpisodesBySeason(seriesId, seasonNumber)); - return View(new GridModel(episodes)); + using (MiniProfiler.StepStatic("Controller")) + { + var episodes = GetEpisodeModels(_episodeProvider.GetEpisodesBySeason(seriesId, seasonNumber)); + return View(new GridModel(episodes)); + } } public ActionResult SearchForSeries(string seriesName) @@ -240,7 +244,7 @@ private List GetEpisodeModels(IList episodesInDb) SeasonNumber = e.SeasonNumber, Title = e.Title, Overview = e.Overview, - AirDate = e.AirDate, + AirDate = e.AirDate.Value, Path = episodePath, EpisodeFileId = episodeFileId, Status = e.Status.ToString(), diff --git a/NzbDrone.Web/Controllers/UpcomingController.cs b/NzbDrone.Web/Controllers/UpcomingController.cs index ceaacb5d5..5b463da2f 100644 --- a/NzbDrone.Web/Controllers/UpcomingController.cs +++ b/NzbDrone.Web/Controllers/UpcomingController.cs @@ -37,7 +37,7 @@ public ActionResult _AjaxBindingYesterday() EpisodeNumber = u.EpisodeNumber, Title = u.Title, Overview = u.Overview, - AirDate = u.AirDate.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay) + AirDate = u.AirDate.Value.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay) }); return View(new GridModel(upcoming)); @@ -55,7 +55,7 @@ public ActionResult _AjaxBindingToday() EpisodeNumber = u.EpisodeNumber, Title = u.Title, Overview = u.Overview, - AirDate = u.AirDate.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay) + AirDate = u.AirDate.Value.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay) }); return View(new GridModel(upcoming)); @@ -73,7 +73,7 @@ public ActionResult _AjaxBindingTomorrow() EpisodeNumber = u.EpisodeNumber, Title = u.Title, Overview = u.Overview, - AirDate = u.AirDate.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay) + AirDate = u.AirDate.Value.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay) }); return View(new GridModel(upcoming)); @@ -91,7 +91,7 @@ public ActionResult _AjaxBindingWeek() EpisodeNumber = u.EpisodeNumber, Title = u.Title, Overview = u.Overview, - AirDate = u.AirDate.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay) + AirDate = u.AirDate.Value.Add(Convert.ToDateTime(u.Series.AirTimes).TimeOfDay) }); return View(new GridModel(upcoming)); diff --git a/NzbDrone.Web/Global.asax.cs b/NzbDrone.Web/Global.asax.cs index 8bec6011c..56caffc54 100644 --- a/NzbDrone.Web/Global.asax.cs +++ b/NzbDrone.Web/Global.asax.cs @@ -12,6 +12,7 @@ using NLog; using NzbDrone.Core; using NzbDrone.Core.Instrumentation; +using Telerik.Web.Mvc; namespace NzbDrone.Web { @@ -36,7 +37,7 @@ public static void RegisterRoutes(RouteCollection routes) protected override void OnApplicationStarted() { base.OnApplicationStarted(); - + WebAssetDefaultSettings.UseTelerikContentDeliveryNetwork = true; RegisterRoutes(RouteTable.Routes); //base.OnApplicationStarted(); AreaRegistration.RegisterAllAreas(); diff --git a/NzbDrone.Web/Views/Series/Index.cshtml b/NzbDrone.Web/Views/Series/Index.cshtml index 3b7e380b1..5a74b77d1 100644 --- a/NzbDrone.Web/Views/Series/Index.cshtml +++ b/NzbDrone.Web/Views/Series/Index.cshtml @@ -6,36 +6,7 @@ Series } - -